Safe Haskell | None |
---|---|
Language | Haskell98 |
Control.Effect.State
- data Set n where
- get :: Var v -> State `[v :-> (a :! R)]` a
- put :: Var v -> a -> State `[k :-> (a :! W)]` ()
- data State s a = State {}
- data k :-> v = (Var k) :-> v
- data a :! s = a :! (Action s)
- data Eff
- data Action s = Eff
- data Var k where
- union :: Unionable s t => Set s -> Set t -> Set (UnionS s t)
- type UnionS s t = Nub (Sort (Append s t))
- type family Reads t
- type family Writes t
- type Unionable s t = (Sortable (Append s t), Nubable (Sort (Append s t)) (Nub (Sort (Append s t))), Split s t (Union s t))
- type Sortable s = Bubbler s s
- type SetLike s = Nub (Sort s)
- type StateSet f = (StateSetProperties f, StateSetProperties (Reads f), StateSetProperties (Writes f))
- type IntersectR s t = (Sortable (Append s t), Update (Sort (Append s t)) t)
- class Update t v
- type Sort l = Bubble l l
- class Split s t st
Documentation
get :: Var v -> State `[v :-> (a :! R)]` a Source
Read from a variable v
of type a
. Raise a read effect. |
put :: Var v -> a -> State `[k :-> (a :! W)]` () Source
Write to a variable v
with a value of type a
. Raises a write effect |
Parametric effect state monad |
Instances
Effect [*] State | |
type Unit [*] State = [] * | |
type Plus [*] State s t = UnionS s t | |
type Inv [*] State s t = (IsSet s, IsSet (Reads s), IsSet (Writes s), IsSet t, IsSet (Reads t), IsSet (Writes t), (~) [*] (Reads (Reads t)) (Reads t), (~) [*] (Writes (Writes s)) (Writes s), Split (Reads s) (Reads t) (Reads (UnionS s t)), Unionable (Writes s) (Writes t), IntersectR (Writes s) (Reads t), (~) [*] (Writes (UnionS s t)) (UnionS (Writes s) (Writes t))) |
Instances
(Show (Var k), Show v) => Show ((:->) k v) | |
Chooser (CmpSymbol j k) => OrdH ((:->) j u) ((:->) k v) | |
(Monoid u, Nubable ((:) * ((:->) k u) s)) => Nubable ((:) * ((:->) k u) ((:) * ((:->) k u) s)) | Define the operation for removing duplicates using mappend | |
Update ((:) * ((:->) j ((:!) b s)) as) as' => Update ((:) * ((:->) k ((:!) a W)) ((:) * ((:->) j ((:!) b s)) as)) as' | |
Update ((:) * ((:->) k ((:!) a R)) as) as' => Update ((:) * ((:->) k ((:!) a W)) ((:) * ((:->) k ((:!) b R)) as)) as' | |
Update ((:) * ((:->) k ((:!) b R)) as) as' => Update ((:) * ((:->) k ((:!) a s)) ((:) * ((:->) k ((:!) b s)) as)) as' | |
Update ((:) * ((:->) j ((:!) b s)) as) as' => Update ((:) * ((:->) k ((:!) a R)) ((:) * ((:->) j ((:!) b s)) as)) ((:) * ((:->) k ((:!) a R)) as') | |
type Max ((:->) j u) ((:->) k v) = (:->) (Select Symbol j k k j) (Select * j k v u) | |
type Min ((:->) j u) ((:->) k v) = (:->) (Select Symbol j k j k) (Select * j k u v) |
Describes an effect action s
on a value of type a
|
Instances
(Show (Action f), Show a) => Show ((:!) a f) | |
Update ((:) * ((:->) j ((:!) b s)) as) as' => Update ((:) * ((:->) k ((:!) a W)) ((:) * ((:->) j ((:!) b s)) as)) as' | |
Update ((:) * ((:->) k ((:!) a R)) as) as' => Update ((:) * ((:->) k ((:!) a W)) ((:) * ((:->) k ((:!) b R)) as)) as' | |
Update ((:) * ((:->) k ((:!) b R)) as) as' => Update ((:) * ((:->) k ((:!) a s)) ((:) * ((:->) k ((:!) b s)) as)) as' | |
Update ((:) * ((:->) j ((:!) b s)) as) as' => Update ((:) * ((:->) k ((:!) a R)) ((:) * ((:->) j ((:!) b s)) as)) ((:) * ((:->) k ((:!) a R)) as') |
Provides a wrapper for effect actions |
Constructors
Eff |
union :: Unionable s t => Set s -> Set t -> Set (UnionS s t) Source
Union operation for state effects |
Calculate just the reader effects |
Calculate just the writer effects |
type Unionable s t = (Sortable (Append s t), Nubable (Sort (Append s t)) (Nub (Sort (Append s t))), Split s t (Union s t)) Source
type StateSet f = (StateSetProperties f, StateSetProperties (Reads f), StateSetProperties (Writes f)) Source
Captures what it means to be a set of state effects |
Update reads, that is any writes are pushed into reads, a bit like intersection |
Minimal complete definition
update
Instances
Update xs ([] *) | |
Update ((:) * ((:->) j ((:!) b s)) as) as' => Update ((:) * ((:->) k ((:!) a W)) ((:) * ((:->) j ((:!) b s)) as)) as' | |
Update ((:) * ((:->) k ((:!) a R)) as) as' => Update ((:) * ((:->) k ((:!) a W)) ((:) * ((:->) k ((:!) b R)) as)) as' | |
Update ((:) * ((:->) k ((:!) b R)) as) as' => Update ((:) * ((:->) k ((:!) a s)) ((:) * ((:->) k ((:!) b s)) as)) as' | |
Update ((:) * e ([] *)) ((:) * e ([] *)) | |
Update ((:) * ((:->) j ((:!) b s)) as) as' => Update ((:) * ((:->) k ((:!) a R)) ((:) * ((:->) j ((:!) b s)) as)) ((:) * ((:->) k ((:!) a R)) as') |