module Data.Record.Anon.Internal.Plugin.Source.Options (
    -- * Options
    Options(..)
  , parseOpts
    -- * Mode
  , Mode(..)
  , parseMode
  ) where

{-------------------------------------------------------------------------------
  Options
-------------------------------------------------------------------------------}

data Options = Options {
      Options -> Bool
debug   :: Bool -- ^ Dump generated code
    , Options -> Bool
typelet :: Bool -- ^ Integrate with @typelet@ for truly O(1) coresize
    , Options -> Bool
noapply :: Bool -- ^ Omit the call to 'applyDiff'
    }

defaultOptions :: Options
defaultOptions :: Options
defaultOptions = Options {
      debug :: Bool
debug   = Bool
False
    , typelet :: Bool
typelet = Bool
False
    , noapply :: Bool
noapply = Bool
False
    }

parseOpts :: [String] -> Options
parseOpts :: [String] -> Options
parseOpts = ((Options -> Options) -> Options -> Options
forall a b. (a -> b) -> a -> b
$ Options
defaultOptions) ((Options -> Options) -> Options)
-> ([String] -> Options -> Options) -> [String] -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Options -> Options)
 -> (Options -> Options) -> Options -> Options)
-> (Options -> Options)
-> [Options -> Options]
-> Options
-> Options
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) Options -> Options
forall a. a -> a
id ([Options -> Options] -> Options -> Options)
-> ([String] -> [Options -> Options])
-> [String]
-> Options
-> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Options -> Options) -> [String] -> [Options -> Options]
forall a b. (a -> b) -> [a] -> [b]
map String -> Options -> Options
aux
  where
    aux :: String -> Options -> Options
    aux :: String -> Options -> Options
aux String
"debug"   Options
opts = Options
opts { debug   = True }
    aux String
"typelet" Options
opts = Options
opts { typelet = True }
    aux String
"noapply" Options
opts = Options
opts { noapply = True }
    aux String
opt       Options
_    = String -> Options
forall a. HasCallStack => String -> a
error (String -> Options) -> String -> Options
forall a b. (a -> b) -> a -> b
$ String
"invalid option: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
opt

{-------------------------------------------------------------------------------
  Mode
-------------------------------------------------------------------------------}

data Mode = Simple | Advanced

parseMode :: String -> Maybe Mode
parseMode :: String -> Maybe Mode
parseMode String
"ANON"   = Mode -> Maybe Mode
forall a. a -> Maybe a
Just Mode
Simple
parseMode String
"ANON_F" = Mode -> Maybe Mode
forall a. a -> Maybe a
Just Mode
Advanced
parseMode String
_        = Maybe Mode
forall a. Maybe a
Nothing