barrie-0.3.1: src/Barrie/Config.lhs
> {-# OPTIONS_GHC -XMultiParamTypeClasses -XFunctionalDependencies #-}
> module Barrie.Config where
> data Config a = Cfg {
> cEnabled :: a -> Bool,
> cLabel :: Maybe (a -> String)
> }
> defaultConfig :: Config a
> defaultConfig = Cfg { cEnabled = const True, cLabel = Nothing }
> transformConfig :: (a -> b) -> Config b -> Config a
> transformConfig get cfg = cfg { cEnabled = cEnabled cfg . get,
> cLabel = label'
> }
> where label' = case cLabel cfg of
> Nothing -> Nothing
> Just f -> Just $ f . get
> enabledCfg :: (a -> Bool) -> Config a -> Config a
> enabledCfg f config = config { cEnabled = f }
> isEnabled :: Config a -> a -> Bool
> isEnabled config state = cEnabled config state
> labelConfig :: (a -> String) -> Config a -> Config a
> labelConfig f config = config { cLabel = Just f }
> configHasLabel :: Config a -> Bool
> configHasLabel Cfg { cLabel = Nothing } = False
> configHasLabel _ = True
> configLabel :: Config a -> a -> String
> configLabel Cfg { cLabel = Just f } st = f st
> configLabel _ _ =
> error "tried to get a label from a config which has none"