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] [Publish]

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]


Change log CHANGES.md
Dependencies base (>=4.7 && <5), fused-effects (>=0.1.2 && <1), microlens (>=0.4 && <1) [details]
License BSD-3-Clause
Copyright 2018 Patrick Thomson
Author Patrick Thomson
Maintainer patrickt@github.com
Category Web
Home page https://github.com/fused-effects/fused-effects-lens#readme
Source repo head: git clone https://github.com/fused-effects/fused-effects
Uploaded by patrick_thomson at 2019-05-28T21:19:47Z




Maintainer's Corner

For package maintainers and hackage trustees

Readme for fused-effects-lens-

[back to package description]


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)


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.


BSD3, like fused-effects.