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