-- 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 <a>Has</a> class which provide simple extensible
--   product. The use case for this class is illustrated as following:
--   
--   <pre>
--   {-# LANGUAGE FlexibleContexts #-}
--   
--   -- in some library code
--   ...
--   logInAnyReaderHasLogger :: (Has Logger r, MonadReader r m) =&gt; LogString -&gt; m ()
--   logInAnyReaderHasLogger s = asks getter &gt;&gt;= logWithLogger s
--   
--   queryInAnyReaderHasSQL :: (Has SqlBackEnd r, MonadReader r m) =&gt; Query -&gt; m a
--   queryInAnyReaderHasSQL q = asks getter &gt;&gt;= queryWithSQL q
--   ...
--   
--   -- now you want to use these effects together
--   ...
--   logger &lt;- initLogger  ...
--   sql &lt;- initSqlBackEnd ...
--   
--   (`runReader` (logger, sql)) $ do
--         ...
--         logInAnyReaderHasLogger ...
--         ...
--         x &lt;- queryInAnyReaderHasSQL ...
--         ...
--   </pre>
--   
--   If you need multiple elements with same type, you can use
--   <a>tagged</a> like:
--   
--   <pre>
--   (Has (Tagged "StdLogger" Logger) r, Has (Tagged "FileLogger" Logger) r, ...) =&gt; ...
--   
--   runYourMonad ... ( stdLogger :: Tagged "StdLogger" Logger
--                    , fileLogger :: Tagged "FileLogger" Logger, ...)
--   </pre>
--   
--   Or you can define newtypes(which is less verbose and require no
--   dependency):
--   
--   <pre>
--   newtype StdLogger = StdLogger Logger
--   newtype FileLogger = FileLogger Logger
--   
--   runYourMonad ... (StdLogger stdLogger, FileLogger fileLogger)
--   </pre>
--   
--   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:
--   
--   <pre>
--   ... (3 :: Int, "hello" :: String, ...)
--   </pre>
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 <a>Has</a>, but most of the time tuples
--   will do fine.
class Has a 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)
