references: Generalization of lenses, folds and traversals to handle monads and addition.
References can read, write or update parts of the data. They are first-class values, can be passed in functions, transformed, combined. References generalize lenses, folds and traversals for haskell (see: https://hackage.haskell.org/package/lens).
There are two things that references can do but the previously mentioned access methods don't.
References can cooperate with monads, for example IO.
References can be added using the
&+&operator, to create new lenses more easily.
Basic idea taken from the currently not maintained package https://hackage.haskell.org/package/yall.
An example use of the references (a logger application that spawns new threads to update a global log):
logger =
(forever $ do
log <- logChan ^! chan&logRecord -- Extract the log record from the received log message
thrId <- forkIO (do time <- getTime
ioref&lastLogTime != time $ logDB -- Update the last logging time mutable log database
let logMsg = senderThread .- show -- Transform the thread id to a string and
$ loggingTime .= time -- update the time
$ log -- inside the log message
ioref&debugInfos !~ addLogEntry log $ logDB -- update the table of log entries
mvar !- (+1) $ count )
mvar !- (thrId:) $ updaters -- Record the spawned thread
) `catch` stopUpdaters updaters
where stopUpdaters updaters ThreadKilled =
mvar&traverse *!| killThread $ updaters -- Kill all spawned threads before stoppingThere are a bunch of predefined references for datatypes included in standard libraries.
New references can be created in several ways:
From getter, setter and updater, using the
referencefunction.From getter and setter, using one of the simplified functions (
lens,simplePartial,partial, ...).Using the
Data.Traversalinstance on a datatype to generate a traversal of each element.Using lenses from
Control.Lenspackage. There are a lot of packages defining lenses, folds and traversals for various data structures, so it is very useful that all of them can simply be converted into a reference.Generating references for newly defined records using the
makeReferencesTemplate Haskell function.
Modules
[Index]
Downloads
- references-0.2.0.0.tar.gz [browse] (Cabal source package)
- Package description (revised from the package)
Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
- No Candidates
| Versions [RSS] | 0.1.0.0, 0.2.0.0, 0.2.1.0, 0.2.1.1, 0.2.1.2, 0.3.0.0, 0.3.0.1, 0.3.1.0, 0.3.1.1, 0.3.2.0, 0.3.2.1, 0.3.2.2, 0.3.3.0, 0.3.3.1 |
|---|---|
| Dependencies | base (>=4.6 && <5), containers (>=0.5 && <0.6), either (>=4.3 && <4.4), lens (>=4.2 && <4.3), lifted-base (>=0.2 && <0.3), monad-control (>=0.3 && <0.4), mtl (>=2.2 && <2.3), template-haskell (>=2.8 && <3), transformers (>=0.4 && <0.5), transformers-base (>=0.4 && <0.5) [details] |
| License | BSD-3-Clause |
| Author | Boldizsar Nemeth |
| Maintainer | nboldi@elte.hu |
| Uploaded | by lazac at 2014-08-14T12:27:01Z |
| Revised | Revision 1 made by lazac at 2014-08-14T12:41:51Z |
| Category | Control |
| Home page | https://github.com/lazac/references |
| Distributions | |
| Reverse Dependencies | 15 direct, 0 indirect [details] |
| Downloads | 11172 total (73 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] |