Skip to content

Commit f31a39f

Browse files
authored
Add Instances for StoreT, New MonadStore Instances, Rework MonadAsk Instance (#14)
* Add instances for StoreT and make MonadAsk delegate to base monad * Add MonadStore instances for common transformers
1 parent 368a8e4 commit f31a39f

File tree

2 files changed

+65
-3
lines changed

2 files changed

+65
-3
lines changed

spago.dhall

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{ name = "halogen-store"
22
, dependencies =
33
[ "aff"
4+
, "distributive"
45
, "effect"
56
, "foldable-traversable"
67
, "halogen"
@@ -9,6 +10,7 @@
910
, "maybe"
1011
, "prelude"
1112
, "refs"
13+
, "tailrec"
1214
, "transformers"
1315
, "tuples"
1416
, "unsafe-coerce"

src/Halogen/Store/Monad.purs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,18 @@ module Halogen.Store.Monad where
22

33
import Prelude
44

5+
import Control.Monad.Cont (class MonadCont, ContT)
56
import Control.Monad.Error.Class (class MonadError, class MonadThrow)
6-
import Control.Monad.Reader (class MonadAsk, ReaderT, ask, lift, mapReaderT, runReaderT)
7+
import Control.Monad.Except (ExceptT)
8+
import Control.Monad.Identity.Trans (IdentityT)
9+
import Control.Monad.Maybe.Trans (MaybeT)
10+
import Control.Monad.RWS (RWST)
11+
import Control.Monad.Reader (class MonadAsk, class MonadReader, ReaderT(..), ask, lift, local, mapReaderT, runReaderT)
12+
import Control.Monad.Rec.Class (class MonadRec)
13+
import Control.Monad.State (class MonadState, StateT)
14+
import Control.Monad.Trans.Class (class MonadTrans)
15+
import Control.Monad.Writer (class MonadTell, class MonadWriter, WriterT)
16+
import Data.Distributive (class Distributive)
717
import Data.Foldable (traverse_)
818
import Data.Maybe (Maybe(..))
919
import Effect (Effect)
@@ -55,9 +65,19 @@ derive newtype instance MonadEffect m => MonadEffect (StoreT a s m)
5565
derive newtype instance MonadAff m => MonadAff (StoreT a s m)
5666
derive newtype instance MonadThrow e m => MonadThrow e (StoreT a s m)
5767
derive newtype instance MonadError e m => MonadError e (StoreT a s m)
68+
derive newtype instance MonadTell w m => MonadTell w (StoreT a s m)
69+
derive newtype instance MonadWriter w m => MonadWriter w (StoreT a s m)
70+
derive newtype instance MonadState s m => MonadState s (StoreT a s m)
71+
derive newtype instance MonadCont m => MonadCont (StoreT a s m)
72+
derive newtype instance MonadRec m => MonadRec (StoreT a s m)
73+
derive newtype instance Distributive g => Distributive (StoreT a s g)
74+
derive newtype instance MonadTrans (StoreT a s)
5875

59-
instance MonadEffect m => MonadAsk s (StoreT a s m) where
60-
ask = getStore
76+
instance MonadAsk r m => MonadAsk r (StoreT a s m) where
77+
ask = lift ask
78+
79+
instance MonadReader r m => MonadReader r (StoreT a s m) where
80+
local f (StoreT (ReaderT r)) = StoreT $ ReaderT $ local f <<< r
6181

6282
instance MonadEffect m => MonadStore a s (StoreT a s m) where
6383
getStore = StoreT do
@@ -109,6 +129,46 @@ instance monadStoreHookM :: MonadStore a s m => MonadStore a s (Hooks.HookM m) w
109129
updateStore = lift <<< updateStore
110130
emitSelected = lift <<< emitSelected
111131

132+
instance MonadStore a s m => MonadStore a s (ContT r m) where
133+
getStore = lift getStore
134+
updateStore = lift <<< updateStore
135+
emitSelected = lift <<< emitSelected
136+
137+
instance MonadStore a s m => MonadStore a s (ExceptT e m) where
138+
getStore = lift getStore
139+
updateStore = lift <<< updateStore
140+
emitSelected = lift <<< emitSelected
141+
142+
instance MonadStore a s m => MonadStore a s (IdentityT m) where
143+
getStore = lift getStore
144+
updateStore = lift <<< updateStore
145+
emitSelected = lift <<< emitSelected
146+
147+
instance MonadStore a s m => MonadStore a s (MaybeT m) where
148+
getStore = lift getStore
149+
updateStore = lift <<< updateStore
150+
emitSelected = lift <<< emitSelected
151+
152+
instance (MonadStore a s m, Monoid w) => MonadStore a s (RWST r w s m) where
153+
getStore = lift getStore
154+
updateStore = lift <<< updateStore
155+
emitSelected = lift <<< emitSelected
156+
157+
instance MonadStore a s m => MonadStore a s (ReaderT r m) where
158+
getStore = lift getStore
159+
updateStore = lift <<< updateStore
160+
emitSelected = lift <<< emitSelected
161+
162+
instance MonadStore a s m => MonadStore a s (StateT s m) where
163+
getStore = lift getStore
164+
updateStore = lift <<< updateStore
165+
emitSelected = lift <<< emitSelected
166+
167+
instance (MonadStore a s m, Monoid w) => MonadStore a s (WriterT w m) where
168+
getStore = lift getStore
169+
updateStore = lift <<< updateStore
170+
emitSelected = lift <<< emitSelected
171+
112172
-- | Run a component in the `StoreT` monad.
113173
-- |
114174
-- | Requires an initial value for the store, `s`, and a reducer that updates

0 commit comments

Comments
 (0)