The wiring package
This package provides the ability to join up or wire instances of types (such as ReaderT, WriterT and RWST) with some semi-automatic conversions.
With ReaderT there might be two functions already written that we wish to compose:
userLookup :: Int -> ReaderT (Resource1, Database1) IO User ordersLookup :: Int -> ReaderT (Database2, Resource1) IO [String]
Ordinarily these could not be used together because their environment type differs, which reduces the utility of ReaderT as a method of dependency injection.
However with use of the wire method from the Wirable typeclass it becomes possible to use these two together with little pain.
composedLookup :: Int -> ReaderT (Resource1, Database1, Database2) IO String composedLookup userId = do user <- wire $ userLookup userId orders <- wire $ ordersLookup userId return $ describeOrders user orders
Built in are instances of Wirable for transforming tuples to their individual fields, like taking a from a tuple (a, b, c).
As well as producing new tuples from existing tuples, starting with a tuple of (a, b, c) and returning a tuple of (c, a).
WriterT and RWST are similarly well supported, including the ability to promote from ReaderT/WriterT up to RWST.
Some existing functionality is extended like for instance with the wiredAsk and wiredTell functions.
|Versions||0.2.0.0, 0.2.0.1, 0.2.1, 0.3.0, 0.4.0, 0.4.1, 0.4.2, 0.5.0|
|Dependencies||base (>=4.7 && <4.10), mtl, template-haskell (>=2.7 && <2.12), transformers [details]|
|Source repository||head: git clone git://github.com/seanparsons/wiring.git|
|Uploaded||Thu Oct 27 10:59:06 UTC 2016 by seanparsons|
|Downloads||760 total (28 in the last 30 days)|
|Status||Docs available [build log]
Last success reported on 2016-10-30 [all 1 reports]
For package maintainers and hackage trustees