From e08de1f8f732535151166780cfccc4177db2bb94 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Sat, 4 Mar 2023 19:01:23 -0800 Subject: [PATCH] Add MonadLogic instence for ReaderT --- src/Control/Monad/Logic/Class.purs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Control/Monad/Logic/Class.purs b/src/Control/Monad/Logic/Class.purs index ec87009..14a337c 100644 --- a/src/Control/Monad/Logic/Class.purs +++ b/src/Control/Monad/Logic/Class.purs @@ -3,8 +3,8 @@ module Control.Monad.Logic.Class (class MonadLogic, msplit, interleave, fbind, r import Prelude import Control.MonadPlus (class MonadPlus, (<|>), empty) -import Control.Monad.State (runStateT) -import Control.Monad.State.Trans (StateT(..)) +import Control.Monad.State.Trans (StateT(..), runStateT) +import Control.Monad.Reader.Trans (ReaderT(..), runReaderT) import Data.Tuple.Nested (type (/\), (/\)) import Data.Maybe (Maybe(..)) @@ -32,3 +32,10 @@ instance MonadLogic m => MonadLogic (StateT s m) where Nothing -> pure (Nothing /\ s) Just ((a /\ s') /\ m) -> pure (Just (a /\ (StateT $ const m)) /\ s') interleave m1 m2 = StateT $ \s -> runStateT m1 s <|> runStateT m2 s + +instance MonadLogic m => MonadLogic (ReaderT r m) where + msplit sm = ReaderT $ \r -> do + msplit (runReaderT sm r) >>= case _ of + Nothing -> pure Nothing + Just (a /\ m) -> pure $ Just $ a /\ (ReaderT $ const m) + interleave m1 m2 = ReaderT $ \r -> runReaderT m1 r <|> runReaderT m2 r