-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Automatically generate composable accessors for data types. -- -- This module provides a simple abstract data type for a piece of a data -- stucture that can be read from and written to. It provides an -- automatic Template Haskell routine to scour data type definitions and -- generate accessor objects for them automatically. @package data-accessor @version 0.0.1 -- | This module provides a simple abstract data type for a piece of a data -- stucture that can be read from and written to. It provides an -- automatic Template Haskell routine to scour data type definitions and -- generate accessor objects for them automatically. module Data.Accessor -- | An Accessor s a is an object that encodes how to get and put -- a subject of type a out of/into an object of type s. -- -- In order for an instance of this data structure a to be an -- Accessor, it must obey the following laws: -- --
--   getVal a (setVal a x s) = x
--   setVal a (getVal a s) s = s
--   
data Accessor s a Accessor :: (s -> a) -> (a -> s -> s) -> Accessor s a getVal :: Accessor s a -> s -> a setVal :: Accessor s a -> a -> s -> s -- | nameDeriveAccessors n f where n is the name of a -- data type declared with data and f is a function -- from names of fields in that data type to the name of the -- corresponding accessor. If f returns Nothing, then -- no accessor is generated for that field. nameDeriveAccessors :: Name -> (String -> Maybe String) -> Q [Dec] -- | deriveAccessors n where n is the name of a data type -- declared with data looks through all the declared fields of -- the data type, and for each field ending in an underscore generates an -- accessor of the same name without the underscore. -- -- It is nameDeriveAccessors n f where f satisfies -- --
--   f (s ++ "_") = Just s
--   f x          = x       -- otherwise
--   
-- -- For example, given the data type: -- --
--   data Score = Score { p1Score_ :: Int
--                      , p2Score_ :: Int
--                      , rounds   :: Int
--                      }
--   
-- -- deriveAccessors will generate the following objects: -- --
--   p1Score :: Accessor Score Int
--   p1Score = Accessor p1Score_ (\x s -> s { p1Score_ = x })
--   p2Score :: Accessor Score Int
--   p2Score = Accessor p2Score_ (\x s -> s { p2Score_ = x })
--   
deriveAccessors :: Name -> Q [Dec] -- | A structural dereference function for state monads. getA :: (MonadState s m) => Accessor s a -> m a -- | A structural assignment function for state monads. putA :: (MonadState s m) => Accessor s a -> a -> m () -- | A structural modification function for state monads. modA :: (MonadState s m) => Accessor s a -> (a -> a) -> m () -- | Accessor composition. (.>) :: Accessor a b -> Accessor b c -> Accessor a c -- | Accessor composition the other direction. -- --
--   (<.) = flip (.>)
--   
(<.) :: Accessor b c -> Accessor a b -> Accessor a c -- | An assignment operator for state monads. -- --
--   (=:) = putA
--   
(=:) :: (MonadState s m) => Accessor s a -> a -> m ()