heart-core 0.3.1 → 0.3.2
raw patch · 3 files changed
+42/−2 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Heart.Core.Prelude: class (Monoid w, Monad m) => MonadWriter w (m :: Type -> Type) | m -> w
+ Heart.Core.Prelude: listen :: MonadWriter w m => m a -> m (a, w)
+ Heart.Core.Prelude: pass :: MonadWriter w m => m (a, w -> w) -> m a
+ Heart.Core.Prelude: tell :: MonadWriter w m => w -> m ()
+ Heart.Core.Prelude: writer :: MonadWriter w m => (a, w) -> m a
+ Heart.Core.RIO: class HasWriteRef w env | env -> w
+ Heart.Core.RIO: instance (GHC.Base.Monoid w, Heart.Core.RIO.HasWriteRef w env) => Control.Monad.Writer.Class.MonadWriter w (Heart.Core.RIO.RIO env)
+ Heart.Core.RIO: instance Heart.Core.RIO.HasWriteRef a (Heart.Core.RIO.SomeRef a)
+ Heart.Core.RIO: listenWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m) => m a -> m (a, w)
+ Heart.Core.RIO: passWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m) => m (a, w -> w) -> m a
+ Heart.Core.RIO: tellWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m, Semigroup w) => w -> m ()
+ Heart.Core.RIO: writeRefL :: HasWriteRef w env => Lens' env (SomeRef w)
Files
- heart-core.cabal +2/−2
- src/Heart/Core/Prelude.hs +2/−0
- src/Heart/Core/RIO.hs +38/−0
heart-core.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 1f883982f64deac0d3cefeb13edb5bb554a6e3b717ae53a5a428f51ea1d0fd01+-- hash: c73018931129ae191793890d4afc45b2d689e79b8aeca338c967169cc97f627c name: heart-core-version: 0.3.1+version: 0.3.2 synopsis: An opinionated library prelude in the UnliftIO style description: Please see the README on GitHub at <https://github.com/ejconlon/heart-core#readme> category: Prelude
src/Heart/Core/Prelude.hs view
@@ -28,6 +28,7 @@ , MonadThrow (..) , MonadTrans (..) , MonadUnliftIO (..)+ , MonadWriter (..) , Newtype , NFData , Prism'@@ -83,6 +84,7 @@ import Control.Monad.Reader (MonadReader (..)) import Control.Monad.State (MonadState (..)) import Control.Monad.Trans (MonadTrans (..))+import Control.Monad.Writer (MonadWriter (..)) import Control.Newtype.Generics (Newtype) import Data.Aeson (FromJSON (..), FromJSONKey, ToJSON (..), ToJSONKey) import Data.Coerce (Coercible, coerce)
src/Heart/Core/RIO.hs view
@@ -8,17 +8,21 @@ -} module Heart.Core.RIO ( HasStateRef (..)+ , HasWriteRef (..) , SomeRef , RIO (..) , getStateRef , liftRIO+ , listenWriteRef , newSomeRef , mapRIO , modifySomeRef , modifyStateRef+ , passWriteRef , putStateRef , runRIO , readSomeRef+ , tellWriteRef , writeSomeRef ) where @@ -88,3 +92,37 @@ instance HasStateRef st env => MonadState st (RIO env) where get = getStateRef put = putStateRef++class HasWriteRef w env | env -> w where+ writeRefL :: Lens' env (SomeRef w)++instance HasWriteRef a (SomeRef a) where+ writeRefL = id++tellWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m, Semigroup w) => w -> m ()+tellWriteRef value = do+ ref <- view writeRefL+ liftIO $ modifySomeRef ref (<> value)++listenWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m) => m a -> m (a, w)+listenWriteRef action = do+ w1 <- view writeRefL >>= liftIO . readSomeRef+ a <- action+ w2 <- do+ refEnv <- view writeRefL+ v <- liftIO $ readSomeRef refEnv+ _ <- liftIO $ writeSomeRef refEnv w1+ return v+ return (a, w2)++passWriteRef :: (HasWriteRef w env, MonadReader env m, MonadIO m) => m (a, w -> w) -> m a+passWriteRef action = do+ (a, transF) <- action+ ref <- view writeRefL+ liftIO $ modifySomeRef ref transF+ return a++instance (Monoid w, HasWriteRef w env) => MonadWriter w (RIO env) where+ tell = tellWriteRef+ listen = listenWriteRef+ pass = passWriteRef