module Evoke.Type.Config
  ( Config(..)
  , fromFlags
  ) where

import qualified Data.List as List
import qualified Evoke.Type.Flag as Flag

data Config = Config
  { Config -> Bool
help :: Bool
  , Config -> Bool
verbose :: Bool
  , Config -> Bool
version :: Bool
  }
  deriving (Config -> Config -> Bool
(Config -> Config -> Bool)
-> (Config -> Config -> Bool) -> Eq Config
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Config -> Config -> Bool
$c/= :: Config -> Config -> Bool
== :: Config -> Config -> Bool
$c== :: Config -> Config -> Bool
Eq, Int -> Config -> ShowS
[Config] -> ShowS
Config -> String
(Int -> Config -> ShowS)
-> (Config -> String) -> ([Config] -> ShowS) -> Show Config
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Config] -> ShowS
$cshowList :: [Config] -> ShowS
show :: Config -> String
$cshow :: Config -> String
showsPrec :: Int -> Config -> ShowS
$cshowsPrec :: Int -> Config -> ShowS
Show)

initial :: Config
initial :: Config
initial = Config :: Bool -> Bool -> Bool -> Config
Config { help :: Bool
help = Bool
False, verbose :: Bool
verbose = Bool
False, version :: Bool
version = Bool
False }

fromFlags :: Foldable t => t Flag.Flag -> Config
fromFlags :: t Flag -> Config
fromFlags = (Config -> Flag -> Config) -> Config -> t Flag -> Config
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' Config -> Flag -> Config
applyFlag Config
initial

applyFlag :: Config -> Flag.Flag -> Config
applyFlag :: Config -> Flag -> Config
applyFlag Config
config Flag
flag = case Flag
flag of
  Flag
Flag.Help -> Config
config { help :: Bool
help = Bool
True }
  Flag
Flag.Verbose -> Config
config { verbose :: Bool
verbose = Bool
True }
  Flag
Flag.Version -> Config
config { version :: Bool
version = Bool
True }