{-| 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 [(Integer, String)] -> Maybe Integer
forall a b. [(a, b)] -> Maybe a
readSToMaybe ([(Integer, String)] -> Maybe Integer)
-> [(Integer, String)] -> Maybe Integer
forall a b. (a -> b) -> a -> b
$ ReadS Integer -> ReadS Integer
forall a. Real a => ReadS a -> ReadS a
readSigned ReadS Integer
forall a. (Eq a, Num a) => ReadS a
readDec String
s of
      Just Integer
int -> Integer
int
      Maybe Integer
Nothing  -> Boz -> Integer
forall a. (Num a, Eq a) => Boz -> a
bozAsNatural (Boz -> Integer) -> Boz -> Integer
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)]
_ -> a -> Maybe a
forall a. a -> Maybe a
Just a
x
                     [(a, b)]
_        -> Maybe a
forall a. Maybe a
Nothing