fused-effects-lens: Monadic lens combinators for fused-effects.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain]

Provides combinators for the lens-based manipulation of state and context types provided by the fused-effects library, similar to those provided for mtl-based monad transformers.


[Skip to ReadMe]

Properties

Versions0.1.0.0, 0.2.0.0, 0.2.0.0
Change logCHANGES.md
Dependenciesbase (>=4.7 && <5), fused-effects (>=0.1.2 && <1), microlens (>=0.4 && <1) [details]
LicenseBSD-3-Clause
Copyright2018 Patrick Thomson
AuthorPatrick Thomson
Maintainerpatrickt@github.com
CategoryWeb
Home pagehttps://github.com/fused-effects/fused-effects-lens#readme
Source repositoryhead: git clone https://github.com/fused-effects/fused-effects
UploadedTue May 28 21:19:47 UTC 2019 by patrick_thomson

Modules

[Index]

Downloads

Maintainers' corner

For package maintainers and hackage trustees


Readme for fused-effects-lens-0.2.0.0

[back to package description]

fused-effects-lens

This package provides an interface to the lens library (and other such libraries such as microlens and generic-lens) that is compatible with fused-effects. The standard formulation of lens combinators for operating in MonadState contexts—use, .=, et al—rely on mtl for MonadState and MonadReader, which is not applicable to Reader and State effects.

This package is meant to be used alongside lens, like so:

import Control.Lens hiding (view, use, assign)
import Control.Effect.Lens (view, use, assign)

Example

Given a Context type that we will use in a State effect:

data Context = Context
  { _amount :: Int
  , _disabled :: Bool
  } deriving (Eq, Show)

makeLenses ''Context

We can can use the use combinators to extract a lens target from the current state, and assign to write to a field of that state:

stateTest :: (Member (State Context) sig, Carrier sig m, Monad m) => m Int
stateTest = do
  initial <- use amount
  amount .= (initial + 1)
  disabled .= True
  use amount

You can find a more complete example, including one that works with multiple State constraints in a single computation, in the test directory.

License

BSD3, like fused-effects.