module Data.Configuration ( Conf, as, valueForKey, (<@>), keys
, (!), toConf, toDyn, toMap) where
import Data.Map hiding ((!), keys)
import qualified Data.Map as M
import Data.Dynamic
import Prelude hiding (lookup)
import Control.Applicative
import Data.Maybe
import Data.Data
newtype Conf = Conf { toMap :: Map String Dynamic } deriving (Typeable)
toConf :: [(String, Dynamic)] -> Conf
toConf = Conf . fromList
as :: a
as = undefined
keys :: Conf -> [String]
keys = M.keys . toMap
valueForKey :: Typeable a => String -> Conf -> a -> Maybe a
valueForKey key conf _ = fromDynamic =<< lookup key (toMap conf)
(!) :: Typeable a => Conf -> String -> a
conf ! key = case valueForKey key conf undefined of
Just val -> val
Nothing -> error $ "no such key: " ++ key
(<@>) :: Typeable a => String -> a -> (String, Dynamic)
key <@> val = (key, toDyn val)