module SimpleConfig where import qualified Data.Map as Map import Data.Map ( Map ) import Data.Char import Data.List import Data.Maybe import Control.Monad newtype SimpleConfig = SimpleConfig { configMap :: Map String (Map String String) } deriving (Eq,Show) load :: FilePath -> IO SimpleConfig load path = parse `fmap` readFile path parse :: String -> SimpleConfig parse txt = SimpleConfig $ Map.fromList ss where ls = lines txt cs = filter (not . null) $ map (takeWhile (/='#')) ls css = groupBy (\_ s -> take 1 s /= "[") cs ss = mapMaybe (\ds -> do brkt <- listToMaybe $ take 1 ds opn <- listToMaybe $ take 1 brkt guard $ opn == '[' let sec = init (drop 1 brkt) return (sec, Map.fromList $ map parseItem $ drop 1 ds) ) css parseItem txt = (key,val) where (key,rst) = span (not . isSpace) $ dropWhile isSpace txt val = dropWhile isSpace rst