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

[ bsd3, library, web ] [ Propose Tags ]

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]
Versions [faq] 0.1.0.0, 0.2.0.0
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 Tue May 28 21:22:29 UTC 2019
Distributions NixOS:0.2.0.0
Downloads 236 total (22 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2019-05-28 [all 1 reports]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's 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.