grab
Version 0.0.0.7 revision 0 uploaded by chris_martin.
Package meta
- Synopsis
- Applicative non-linear consumption
- Description
The Grab type
A grab consumes some portion (none, part, or all) of its input
bag
, and returns aresidue
consisting of the unconsumed input, some monoidallog
(e.g. a list of error messages), and somedesideratum
(the object of desire) produced from the consumed input, orNothing
if the grab failed.newtype Grab bag residue log desideratum = Grab ( bag -> (residue, log, Maybe desideratum) )
Grabs are useful as parsers for inputs such as JSON objects or lists of form parameters, where the input data is not necessarily given linearly in the same order in which we want to consume it.
Applicative composition
A
Simple
grab (where thebag
andresidue
are the same type) has anApplicative
instance.instance (bag ~ residue, Monoid log) => Applicative (Grab bag residue log)
For example, we can create two simple list grabs, one that grabs multiples of two, and the other that grabs multiples of three:
twos, threes :: Monoid log => Control.Grab.Simple [Integer] log [Integer] twos = partition (Data.List.partition (\x -> mod x 2 == 0)) threes = partition (Data.List.partition (\x -> mod x 3 == 0))
λ> runGrabMaybe ((,) <$> twos @() <*> threes @()) [1..10] Just ([2,4,6,8,10],[3,9])
Notice that the second part of the resulting tuple contains only the odd multiples of three. Because
twos
runs first, it consumes6
before thethrees
can get it.Pipeline composition
a / b
is a pipeline of two grabs, where the desideratum froma
is thebag
forb
. . > (/) :: Semigroup log > => Grab bag residue log x > -> Grab x _residue log desideratum > -> Grab bag residue log desideratumλ> runGrabMaybe (twos @() / threes @()) [1..10] Just [6]
λ> runGrabMaybe ((,) <$> (twos @() / threes @()) <*> threes @()) [1..10] Just ([6],[3,9])
- Author
- Chris Martin
- Bug reports
- https://github.com/typeclasses/grab/issues
- Category
- Control
- Copyright
- 2021 Mission Valley Software LLC
- Homepage
- https://github.com/typeclasses/grab
- Maintainer
- Chris Martin, Julie Moronuki
- Package URL
- n/a
- Stability
- n/a