{-# LANGUAGE BlockArguments, OverloadedStrings, RecordWildCards #-}
module Setting where

import Data.Function (on)
import Data.List (sortBy)
import qualified Data.Map.Strict as M
import Data.Text (Text, lines)
import Data.YAML
import Prelude hiding (lines)

import Plugin

data Setting =
     Setting { plugins  :: [Plugin]
             , filetype :: M.Map Text [Text]
             , syntax   :: M.Map Text [Text]
             , before   :: [Text]
             , after    :: [Text]
     } deriving Eq

instance FromYAML Setting where
  parseYAML = withMap "!!map" \o -> do
    plugins <- pluginMapToList <$> o .:? "plugin" .!= M.empty
    filetype <- M.map lines <$> o .:? "filetype" .!= M.empty
    syntax <- M.map lines <$> o .:? "syntax" .!= M.empty
    before <- lines <$> o .:? "before" .!= ""
    after <- lines <$> o .:? "after" .!= ""
    return Setting {..}
      where pluginMapToList = sortWith name . M.foldlWithKey' (\a k v -> v { name = k } : a) []

sortWith :: Ord b => (a -> b) -> [a] -> [a]
sortWith = sortBy . on compare
