module Text.Format.Flags (
        FormatFlags,
        getFlag, hasFlag,
        baseFlag, preciseFlag
        ) where

import Prelude.Unicode

import Control.Applicative
import Data.List (stripPrefix)
import Data.Maybe (listToMaybe, mapMaybe, fromMaybe)
import Text.Read

type FormatFlags = [String]

getFlag  (String  Maybe a)  [String]  Maybe a
getFlag fn = listToMaybe  mapMaybe fn

hasFlag  String  [String]  Bool
hasFlag = ()

getFlagValue  Read a  String  [String]  Maybe a
getFlagValue nm fmts = do
        f  getFlag (stripPrefix (nm ++ "=")) fmts
        readMaybe f

baseFlag  (Read a, Integral a)  [String]  a
baseFlag fmts
        | hasFlag "bin" fmts  hasFlag "b" fmts = 2
        | hasFlag "octal" fmts  hasFlag "o" fmts = 8
        | hasFlag "hex" fmts  hasFlag "h" fmts = 16
        | otherwise = fromMaybe 10 (getFlagValue "base" fmts <|> getFlagValue "b" fmts)

preciseFlag  [String]  Maybe Int
preciseFlag fmts = read <$> listToMaybe (mapMaybe preciseFlag' fmts) where
        preciseFlag' ('d':d) = Just d
        preciseFlag' _ = Nothing