simple-effects 0.3.0.0 → 0.3.0.1
raw patch · 2 files changed
+17/−22 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Control.Effects.State: handleStateT :: Monad m => s -> EffectHandlerState s (StateT s m) a -> m a
+ Control.Effects.State: type EffectHandlerState s m = EffectHandler (GetState s) (EffectHandler (SetState s) m)
- Control.Effects.State: getState :: forall m s. MonadEffect (GetState s) m => m s
+ Control.Effects.State: getState :: forall s m. MonadEffect (GetState s) m => m s
- Control.Effects.State: handleState :: Monad m => s -> EffectHandler (GetState s) (EffectHandler (SetState s) (StateT s m)) a -> m a
+ Control.Effects.State: handleState :: Monad m => m s -> (s -> m ()) -> EffectHandlerState s m a -> m a
- Control.Effects.State: handleStateIO :: forall m s a. MonadIO m => s -> EffectHandler (GetState s) (EffectHandler (SetState s) m) a -> m a
+ Control.Effects.State: handleStateIO :: MonadIO m => s -> EffectHandlerState s m a -> m a
- Control.Effects.State: handleSubstate :: forall s t m a. (MonadEffect (GetState s) m, MonadEffect (SetState s) m) => Lens' s t -> t -> EffectHandler (GetState t) (EffectHandler (SetState t) m) a -> m a
+ Control.Effects.State: handleSubstate :: MonadEffectState s m => Lens' s t -> t -> EffectHandlerState t m a -> m a
- Control.Effects.State: modifyState :: forall m s. (MonadEffect (GetState s) m, MonadEffect (SetState s) m) => (s -> s) -> m ()
+ Control.Effects.State: modifyState :: forall s m. MonadEffectState s m => (s -> s) -> m ()
- Control.Effects.State: setState :: forall m s. MonadEffect (SetState s) m => s -> m ()
+ Control.Effects.State: setState :: forall s m. MonadEffect (SetState s) m => s -> m ()
Files
- simple-effects.cabal +1/−1
- src/Control/Effects/State.hs +16/−21
simple-effects.cabal view
@@ -1,5 +1,5 @@ name: simple-effects-version: 0.3.0.0 +version: 0.3.0.1 synopsis: A simple effect system that integrates with MTL description: Please see README.md homepage: https://gitlab.com/LukaHorvat/simple-effects
src/Control/Effects/State.hs view
@@ -17,16 +17,19 @@ type instance EffectMsg (SetState s) = s type instance EffectRes (SetState s) = () +type MonadEffectState s m = (MonadEffect (GetState s) m, MonadEffect (SetState s) m)+type EffectHandlerState s m = EffectHandler (GetState s) (EffectHandler (SetState s) m)+ {-# INLINE getState #-}-getState :: forall m s. MonadEffect (GetState s) m => m s+getState :: forall s m. MonadEffect (GetState s) m => m s getState = effect (Proxy :: Proxy (GetState s)) () {-# INLINE setState #-}-setState :: forall m s. MonadEffect (SetState s) m => s -> m ()+setState :: forall s m. MonadEffect (SetState s) m => s -> m () setState = effect (Proxy :: Proxy (SetState s)) {-# INLINE modifyState #-}-modifyState :: forall m s. (MonadEffect (GetState s) m, MonadEffect (SetState s) m) => (s -> s) -> m ()+modifyState :: forall s m. MonadEffectState s m => (s -> s) -> m () modifyState f = setState . f =<< getState {-# INLINE handleGetState #-}@@ -37,26 +40,20 @@ handleSetState :: Monad m => (s -> m ()) -> EffectHandler (SetState s) m a -> m a handleSetState = handleEffect -handleStateIO :: forall m s a. MonadIO m- => s -> EffectHandler (GetState s) (EffectHandler (SetState s) m) a -> m a+{-# INLINE handleState #-}+handleState :: Monad m => m s -> (s -> m ()) -> EffectHandlerState s m a -> m a+handleState getter setter = handleSetState setter . handleGetState (lift getter)++handleStateIO :: MonadIO m => s -> EffectHandlerState s m a -> m a handleStateIO initial m = do ref <- liftIO (newIORef initial)- m & handleGetState (liftIO (readIORef ref))- & handleSetState (liftIO . writeIORef ref)+ m & handleState (liftIO (readIORef ref)) (liftIO . writeIORef ref) -{-# INLINE handleState #-}-handleState :: Monad m => s- -> EffectHandler (GetState s)- (EffectHandler (SetState s)- (StateT s m)) a- -> m a-handleState initial m = evalStateT (handleSetState put $ handleGetState get m) initial+{-# INLINE handleStateT #-}+handleStateT :: Monad m => s -> EffectHandlerState s (StateT s m) a -> m a+handleStateT initial m = evalStateT (handleSetState put $ handleGetState get m) initial -handleSubstate :: forall s t m a. (MonadEffect (GetState s) m, MonadEffect (SetState s) m)- => Lens' s t- -> t- -> EffectHandler (GetState t) (EffectHandler (SetState t) m) a- -> m a+handleSubstate :: MonadEffectState s m => Lens' s t -> t -> EffectHandlerState t m a -> m a handleSubstate lensST initial m = do oldState <- getState setState (set lensST initial oldState)@@ -66,5 +63,3 @@ setState (oldState & lensST .~ s)) setState oldState return res--type MonadEffectState s m = (MonadEffect (GetState s) m, MonadEffect (SetState s) m)