{-# LANGUAGE DeriveDataTypeable #-}
module Hledger.Data.RawOptions (
RawOpts,
setopt,
setboolopt,
inRawOpts,
boolopt,
choiceopt,
collectopts,
stringopt,
maybestringopt,
listofstringopt,
intopt,
maybeintopt,
maybecharopt
)
where
import Data.Maybe
import Data.Data
import Data.Default
import Safe
import Hledger.Utils
newtype RawOpts = RawOpts { RawOpts -> [(String, String)]
unRawOpts :: [(String,String)] }
deriving (Int -> RawOpts -> ShowS
[RawOpts] -> ShowS
RawOpts -> String
(Int -> RawOpts -> ShowS)
-> (RawOpts -> String) -> ([RawOpts] -> ShowS) -> Show RawOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RawOpts] -> ShowS
$cshowList :: [RawOpts] -> ShowS
show :: RawOpts -> String
$cshow :: RawOpts -> String
showsPrec :: Int -> RawOpts -> ShowS
$cshowsPrec :: Int -> RawOpts -> ShowS
Show, Typeable RawOpts
Constr
DataType
Typeable RawOpts =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RawOpts -> c RawOpts)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RawOpts)
-> (RawOpts -> Constr)
-> (RawOpts -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c RawOpts))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c RawOpts))
-> ((forall b. Data b => b -> b) -> RawOpts -> RawOpts)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r)
-> (forall u. (forall d. Data d => d -> u) -> RawOpts -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> RawOpts -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts)
-> Data RawOpts
RawOpts -> Constr
RawOpts -> DataType
(forall b. Data b => b -> b) -> RawOpts -> RawOpts
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RawOpts -> c RawOpts
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RawOpts
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> RawOpts -> u
forall u. (forall d. Data d => d -> u) -> RawOpts -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RawOpts
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RawOpts -> c RawOpts
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c RawOpts)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c RawOpts)
$cRawOpts :: Constr
$tRawOpts :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
gmapMp :: (forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
gmapM :: (forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> RawOpts -> m RawOpts
gmapQi :: Int -> (forall d. Data d => d -> u) -> RawOpts -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> RawOpts -> u
gmapQ :: (forall d. Data d => d -> u) -> RawOpts -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> RawOpts -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RawOpts -> r
gmapT :: (forall b. Data b => b -> b) -> RawOpts -> RawOpts
$cgmapT :: (forall b. Data b => b -> b) -> RawOpts -> RawOpts
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c RawOpts)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c RawOpts)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c RawOpts)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c RawOpts)
dataTypeOf :: RawOpts -> DataType
$cdataTypeOf :: RawOpts -> DataType
toConstr :: RawOpts -> Constr
$ctoConstr :: RawOpts -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RawOpts
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RawOpts
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RawOpts -> c RawOpts
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RawOpts -> c RawOpts
$cp1Data :: Typeable RawOpts
Data, Typeable)
instance Default RawOpts where def :: RawOpts
def = [(String, String)] -> RawOpts
RawOpts []
overRawOpts :: ([(String, String)] -> [(String, String)]) -> RawOpts -> RawOpts
overRawOpts f :: [(String, String)] -> [(String, String)]
f = [(String, String)] -> RawOpts
RawOpts ([(String, String)] -> RawOpts)
-> (RawOpts -> [(String, String)]) -> RawOpts -> RawOpts
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, String)] -> [(String, String)]
f ([(String, String)] -> [(String, String)])
-> (RawOpts -> [(String, String)]) -> RawOpts -> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawOpts -> [(String, String)]
unRawOpts
setopt :: String -> String -> RawOpts -> RawOpts
setopt :: String -> String -> RawOpts -> RawOpts
setopt name :: String
name val :: String
val = ([(String, String)] -> [(String, String)]) -> RawOpts -> RawOpts
overRawOpts ([(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [(String
name, String
val)])
setboolopt :: String -> RawOpts -> RawOpts
setboolopt :: String -> RawOpts -> RawOpts
setboolopt name :: String
name = ([(String, String)] -> [(String, String)]) -> RawOpts -> RawOpts
overRawOpts ([(String, String)] -> [(String, String)] -> [(String, String)]
forall a. [a] -> [a] -> [a]
++ [(String
name,"")])
inRawOpts :: String -> RawOpts -> Bool
inRawOpts :: String -> RawOpts -> Bool
inRawOpts name :: String
name = Maybe String -> Bool
forall a. Maybe a -> Bool
isJust (Maybe String -> Bool)
-> (RawOpts -> Maybe String) -> RawOpts -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(String, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup String
name ([(String, String)] -> Maybe String)
-> (RawOpts -> [(String, String)]) -> RawOpts -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawOpts -> [(String, String)]
unRawOpts
boolopt :: String -> RawOpts -> Bool
boolopt :: String -> RawOpts -> Bool
boolopt = String -> RawOpts -> Bool
inRawOpts
choiceopt :: (String -> Maybe a)
-> RawOpts
-> Maybe a
choiceopt :: (String -> Maybe a) -> RawOpts -> Maybe a
choiceopt f :: String -> Maybe a
f = [a] -> Maybe a
forall a. [a] -> Maybe a
lastMay ([a] -> Maybe a) -> (RawOpts -> [a]) -> RawOpts -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, String) -> Maybe a) -> RawOpts -> [a]
forall a. ((String, String) -> Maybe a) -> RawOpts -> [a]
collectopts (String -> Maybe a
f (String -> Maybe a)
-> ((String, String) -> String) -> (String, String) -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, String) -> String
forall a b. (a, b) -> a
fst)
collectopts :: ((String, String) -> Maybe a) -> RawOpts -> [a]
collectopts :: ((String, String) -> Maybe a) -> RawOpts -> [a]
collectopts f :: (String, String) -> Maybe a
f = ((String, String) -> Maybe a) -> [(String, String)] -> [a]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (String, String) -> Maybe a
f ([(String, String)] -> [a])
-> (RawOpts -> [(String, String)]) -> RawOpts -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawOpts -> [(String, String)]
unRawOpts
maybestringopt :: String -> RawOpts -> Maybe String
maybestringopt :: String -> RawOpts -> Maybe String
maybestringopt name :: String
name = String -> [(String, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup String
name ([(String, String)] -> Maybe String)
-> (RawOpts -> [(String, String)]) -> RawOpts -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, String)] -> [(String, String)]
forall a. [a] -> [a]
reverse ([(String, String)] -> [(String, String)])
-> (RawOpts -> [(String, String)]) -> RawOpts -> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawOpts -> [(String, String)]
unRawOpts
stringopt :: String -> RawOpts -> String
stringopt :: String -> RawOpts -> String
stringopt name :: String
name = String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe "" (Maybe String -> String)
-> (RawOpts -> Maybe String) -> RawOpts -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawOpts -> Maybe String
maybestringopt String
name
maybecharopt :: String -> RawOpts -> Maybe Char
maybecharopt :: String -> RawOpts -> Maybe Char
maybecharopt name :: String
name (RawOpts rawopts :: [(String, String)]
rawopts) = String -> [(String, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup String
name [(String, String)]
rawopts Maybe String -> (String -> Maybe Char) -> Maybe Char
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Maybe Char
forall a. [a] -> Maybe a
headMay
listofstringopt :: String -> RawOpts -> [String]
listofstringopt :: String -> RawOpts -> [String]
listofstringopt name :: String
name (RawOpts rawopts :: [(String, String)]
rawopts) = [String
v | (k :: String
k,v :: String
v) <- [(String, String)]
rawopts, String
kString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
name]
maybeintopt :: String -> RawOpts -> Maybe Int
maybeintopt :: String -> RawOpts -> Maybe Int
maybeintopt name :: String
name rawopts :: RawOpts
rawopts =
let ms :: Maybe String
ms = String -> RawOpts -> Maybe String
maybestringopt String
name RawOpts
rawopts in
case Maybe String
ms of Nothing -> Maybe Int
forall a. Maybe a
Nothing
Just s :: String
s -> Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Maybe Int) -> Int -> Maybe Int
forall a b. (a -> b) -> a -> b
$ Int -> String -> Int
forall a. Read a => a -> String -> a
readDef (String -> Int
forall a. String -> a
usageError (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ "could not parse "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
nameString -> ShowS
forall a. [a] -> [a] -> [a]
++" number: "String -> ShowS
forall a. [a] -> [a] -> [a]
++String
s) String
s
intopt :: String -> RawOpts -> Int
intopt :: String -> RawOpts -> Int
intopt name :: String
name = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe 0 (Maybe Int -> Int) -> (RawOpts -> Maybe Int) -> RawOpts -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawOpts -> Maybe Int
maybeintopt String
name