multistate: like mtl's ReaderT/StateT, but more than one contained value/type.

[ bsd3, control, library ] [ Propose Tags ]

Introduction

When using multiple ReaderT's or StateT's in the same monad stack, it becomes necessary to lift the operations in order to affect a specific transformer. Using heterogenous lists (type level functions), a GADT and a corresponding type class, this package provides transformers that remove that necessity: MultiReaderT/MultiStateT can contain a heterogenous list of values.

The type inferred for the getter/setter determines which value is read/written.

Example

             -- an IO action wrapped by a MultiState
             -- containing both a Char and a [Char].
examplePrint :: MultiStateT (Cons [Char] (Cons Char Null)) IO ()
examplePrint = do
  c  <- mGet             -- inferred to be :: m Char
  cs <- mGet             -- inferred to be :: m [Char]
  lift $ putStrLn (c:cs)

This computation can be executed in the following way:

main = evalMultiStateT
     $ withMultiState 'H'
     $ withMultiState "ello, World!"
     $ examplePrint

( you can find this example as an executable in the package. )

Known Deficits

This package currently lacks a complete set of "lifting instances", i.e. instance definitions for classes such as mtl's MonadWriter "over" the newly introduced monad transformers, as in

instance (MonadWriter w m) => MonadWriter w (MultiStateT c m) where ..

These "lifting instances" would be necessary to achieve full compatability with existing transformers. Ping me if you find anything specific missing.

Flags

Automatic Flags
NameDescriptionDefault
build-test

Build the MultiState-test test program

Disabled
build-example

Build the MultiState-example example program

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.1, 0.1.2, 0.1.3.1, 0.1.3.2, 0.2.0.0, 0.3.0.0, 0.6.0.0, 0.6.1.0, 0.6.2.0, 0.7.0.0, 0.7.1.1, 0.7.1.2, 0.8.0.0, 0.8.0.1, 0.8.0.2, 0.8.0.3, 0.8.0.4
Dependencies base (>=4 && <6), mtl (>=2 && <3), multistate, tfp (>=0.8), transformers (>=0.3 && <0.4) [details]
License BSD-3-Clause
Copyright Jan Bracker, Lennart Spitzner
Author Jan Bracker, Lennart Spitzner
Maintainer Lennart Spitzner <lsp@informatik.uni-kiel.de>
Category Control
Home page https://github.com/lspitzner/multistate
Bug tracker https://github.com/lspitzner/multistate/issues
Source repo head: git clone git@github.com:lspitzner/multistate.git
Uploaded by lspitzner at 2014-09-16T21:02:50Z
Distributions Arch:0.8.0.4, Debian:0.8.0.3, LTSHaskell:0.8.0.4, NixOS:0.8.0.4, Stackage:0.8.0.4
Reverse Dependencies 6 direct, 2 indirect [details]
Executables multistate-example, multistate-test
Downloads 20160 total (82 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]