module Control.Effect.Reader (Reader(..), ask, merge, (:->)(..), Var(..), Subset, Set(..)) where
import Control.Effect
import Control.Effect.Helpers.Set
import Control.Effect.Helpers.Mapping
import Prelude hiding (Monad(..))
import GHC.TypeLits
import GHC.Prim
data Reader s a = IxR { runReader :: Set s -> a }
instance Effect Reader where
type Inv Reader f g = (IsSet f, IsSet g, Split f g (Union f g))
type Unit Reader = '[]
type Plus Reader f g = Union f g
return x = IxR $ \Empty -> x
(IxR e) >>= k = IxR $ \fg -> let (f, g) = split fg
in (runReader $ k (e f)) g
ask :: Var v -> Reader '[v :-> a] a
ask Var = IxR $ \(Ext (Var :-> a) Empty) -> a
merge :: (Unionable s t) => (a -> Reader (Union s t) b) -> Reader s (a -> Reader t b)
merge k = IxR $ \s -> \a -> IxR $ \t -> runReader (k a) (union s t)
instance Subset s t => Subeffect Reader s t where
sub (IxR e) = IxR $ \st -> let s = subset st in e s