Wiring, promotion and demotion of types.
This package provides the ability to join up or wire instances of types (such as ReaderT, WriterT and RWST) with some semi-automatic conversions.
ReaderT Example
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
Tuples
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)
.
Other Types
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.