data-has ======== [![Hackage](https://img.shields.io/hackage/v/data-has.svg?style=flat)](http://hackage.haskell.org/package/data-has) [![Build Status](https://travis-ci.org/winterland1989/data-has.svg)](https://travis-ci.org/winterland1989/data-has) 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: ```haskell {-# 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 ... ... ... ```