BSD-3-Clause licensed by winterland1989
Maintained by [email protected]
This version can be pinned in stack with:data-has-0.3.0.0@sha256:c760f7110f44e7e85e6398cab769b4ceb01d54bb2f18e783b3a2edc935248f16,1184

Module documentation for 0.3.0.0

Depends on 1 package(full list with versions):
Used by 1 package in nightly-2017-10-28(full list with versions):

data-has

Hackage Build Status

A simple extensible product system, a typical usage is to free you from considering how to layer your monad stack, because your can now extend your monad in one layer:

 {-# LANGUAGE FlexibleContexts #-}

 -- in some library code
 ...
 logInAnyReaderHasLogger :: (Has Logger r, MonadReader r m) => LogString -> m ()
 logInAnyReaderHasLogger s = asks getter >>= logWithLogger s

 queryInAnyReaderHasSQL :: (Has SqlBackEnd r, MonadReader r m) => Query -> m a
 queryInAnyReaderHasSQL q = asks getter >>= queryWithSQL q
 ...

 -- now you want to use these effects together
 ...
 logger <- initLogger  ...
 sql <- initSqlBackEnd ...

 (`runReader` (logger, sql)) $ do
       ...
       logInAnyReaderHasLogger ...
       ...
       x <- queryInAnyReaderHasSQL ...
       ...
...