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