-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Simple extensible product -- -- Simple extensible product @package data-has @version 0.3.0.0 -- | This module provide Has class which provide simple extensible -- product. The use case for this class is illustrated as following: -- --
--   {-# 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 ...
--         ...
--   
-- -- If you need multiple elements with same type, you can use -- tagged like: -- --
--   (Has (Tagged "StdLogger" Logger) r, Has (Tagged "FileLogger" Logger) r, ...) => ...
--   
--   runYourMonad ... ( stdLogger :: Tagged "StdLogger" Logger
--                    , fileLogger :: Tagged "FileLogger" Logger, ...)
--   
-- -- Or you can define newtypes(which is less verbose and require no -- dependency): -- --
--   newtype StdLogger = StdLogger Logger
--   newtype FileLogger = FileLogger Logger
--   
--   runYourMonad ... (StdLogger stdLogger, FileLogger fileLogger)
--   
-- -- Polymorphic values, such as numeric and string literals(with -- OverloadedString Enabled) may lead to type inference failure, you -- simply need type annotations in these cases: -- --
--   ... (3 :: Int, "hello" :: String, ...)
--   
module Data.Has -- | A type class for extensible product. -- -- We provide instances for tuples up to 12 elements by default. You can -- define your own instance of Has, but most of the time tuples -- will do fine. class Has a t where getter = getConst . hasLens Const modifier f t = runIdentity (hasLens (Identity . f) t) hasLens afa t = (\ a -> modifier (const a) t) <$> afa (getter t) getter :: Has a t => t -> a modifier :: Has a t => (a -> a) -> t -> t hasLens :: Has a t => Lens t a instance Data.Has.Has a a instance Data.Has.Has a (a, b) instance Data.Has.Has b (a, b) instance Data.Has.Has a (a, b, c) instance Data.Has.Has b (a, b, c) instance Data.Has.Has c (a, b, c) instance Data.Has.Has a (a, b, c, d) instance Data.Has.Has b (a, b, c, d) instance Data.Has.Has c (a, b, c, d) instance Data.Has.Has d (a, b, c, d) instance Data.Has.Has a (a, b, c, d, e) instance Data.Has.Has b (a, b, c, d, e) instance Data.Has.Has c (a, b, c, d, e) instance Data.Has.Has d (a, b, c, d, e) instance Data.Has.Has e (a, b, c, d, e) instance Data.Has.Has a (a, b, c, d, e, f) instance Data.Has.Has b (a, b, c, d, e, f) instance Data.Has.Has c (a, b, c, d, e, f) instance Data.Has.Has d (a, b, c, d, e, f) instance Data.Has.Has e (a, b, c, d, e, f) instance Data.Has.Has f (a, b, c, d, e, f) instance Data.Has.Has a (a, b, c, d, e, f, g) instance Data.Has.Has b (a, b, c, d, e, f, g) instance Data.Has.Has c (a, b, c, d, e, f, g) instance Data.Has.Has d (a, b, c, d, e, f, g) instance Data.Has.Has e (a, b, c, d, e, f, g) instance Data.Has.Has f (a, b, c, d, e, f, g) instance Data.Has.Has g (a, b, c, d, e, f, g) instance Data.Has.Has a (a, b, c, d, e, f, g, h) instance Data.Has.Has b (a, b, c, d, e, f, g, h) instance Data.Has.Has c (a, b, c, d, e, f, g, h) instance Data.Has.Has d (a, b, c, d, e, f, g, h) instance Data.Has.Has e (a, b, c, d, e, f, g, h) instance Data.Has.Has f (a, b, c, d, e, f, g, h) instance Data.Has.Has g (a, b, c, d, e, f, g, h) instance Data.Has.Has h (a, b, c, d, e, f, g, h) instance Data.Has.Has a (a, b, c, d, e, f, g, h, i) instance Data.Has.Has b (a, b, c, d, e, f, g, h, i) instance Data.Has.Has c (a, b, c, d, e, f, g, h, i) instance Data.Has.Has d (a, b, c, d, e, f, g, h, i) instance Data.Has.Has e (a, b, c, d, e, f, g, h, i) instance Data.Has.Has f (a, b, c, d, e, f, g, h, i) instance Data.Has.Has g (a, b, c, d, e, f, g, h, i) instance Data.Has.Has h (a, b, c, d, e, f, g, h, i) instance Data.Has.Has i (a, b, c, d, e, f, g, h, i) instance Data.Has.Has a (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has b (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has c (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has d (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has e (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has f (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has g (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has h (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has i (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has j (a, b, c, d, e, f, g, h, i, j) instance Data.Has.Has a (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has b (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has c (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has d (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has e (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has f (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has g (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has h (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has i (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has j (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has k (a, b, c, d, e, f, g, h, i, j, k) instance Data.Has.Has a (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has b (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has c (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has d (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has e (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has f (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has g (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has h (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has i (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has j (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has k (a, b, c, d, e, f, g, h, i, j, k, l) instance Data.Has.Has l (a, b, c, d, e, f, g, h, i, j, k, l)