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 stopping
There 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
reference
function.From getter and setter, using one of the simplified functions (
lens
,simplePartial
,partial
, ...).Using the
Data.Traversal
instance on a datatype to generate a traversal of each element.Using lenses from
Control.Lens
package. 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
makeReferences
Template Haskell function.
Modules
[Index]
Downloads
- references-0.2.1.0.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
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 |
Category | Control |
Home page | https://github.com/lazac/references |
Uploaded | by lazac at 2014-08-20T12:30:12Z |
Distributions | |
Reverse Dependencies | 15 direct, 0 indirect [details] |
Downloads | 10586 total (46 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] |