packages feed

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"