{-| Utils for both lexers. -}
module Language.Fortran.Parser.LexerUtils ( readIntOrBoz ) where

import Language.Fortran.AST.Literal.Boz
import Numeric

-- | Read a string as either a signed integer, or a BOZ constant (positive).
--
-- Useful in manual lexing.
readIntOrBoz :: String -> Integer
readIntOrBoz :: String -> Integer
readIntOrBoz String
s = do
    case forall a b. [(a, b)] -> Maybe a
readSToMaybe forall a b. (a -> b) -> a -> b
$ forall a. Real a => ReadS a -> ReadS a
readSigned forall a. (Eq a, Num a) => ReadS a
readDec String
s of
      Just Integer
int -> Integer
int
      Maybe Integer
Nothing  -> forall a. (Num a, Eq a) => Boz -> a
bozAsNatural forall a b. (a -> b) -> a -> b
$ String -> Boz
parseBoz String
s

readSToMaybe :: [(a, b)] -> Maybe a
readSToMaybe :: forall a b. [(a, b)] -> Maybe a
readSToMaybe = \case (a
x, b
_):[(a, b)]
_ -> forall a. a -> Maybe a
Just a
x
                     [(a, b)]
_        -> forall a. Maybe a
Nothing