packages feed

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 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