The wiring package

[Tags:bsd3, library, test]

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


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.


Versions,, 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]
License BSD3
Author Sean Parsons
Stability provisional
Category Data
Home page
Bug tracker
Source repository head: git clone git://
Uploaded Thu Oct 27 10:59:06 UTC 2016 by seanparsons
Distributions NixOS:0.5.0
Downloads 726 total (7 in the last 30 days)
0 []
Status Docs available [build log]
Last success reported on 2016-10-30 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees