idris-0.9.20: libs/base/Data/String.idr
module Data.String
||| Convert a positive number string to a Num.
|||
||| ```idris example
||| parsePositive "123"
||| ```
||| ```idris example
||| parsePositive {a=Int} " +123"
||| ```
parsePositive : Num a => String -> Maybe a
parsePositive s = parsePosTrimmed (trim s)
where
parsePosTrimmed s with (strM s)
parsePosTrimmed "" | StrNil = Nothing
parsePosTrimmed (strCons x xs) | (StrCons x xs) =
if (x == '+')
then map fromInteger (parsePosAux (unpack xs) 0)
else map fromInteger (parsePosAux (unpack xs) (cast (ord x - ord '0')))
where
parsePosAux : List Char -> Integer -> Maybe Integer
parsePosAux [] acc = Just acc
parsePosAux (c :: cs) acc =
if (c >= '0' && c <= '9')
then parsePosAux cs ((acc * 10) + (cast ((ord c) - (ord '0'))))
else Nothing
||| Convert a number string to a Num.
|||
||| ```idris example
||| parseInteger " 123"
||| ```
||| ```idris example
||| parseInteger {a=Int} " -123"
||| ```
parseInteger : (Num a, Neg a) => String -> Maybe a
parseInteger s = parseIntTrimmed (trim s)
where
parseIntTrimmed s with (strM s)
parseIntTrimmed "" | StrNil = Nothing
parseIntTrimmed (strCons x xs) | (StrCons x xs) =
if (x == '-')
then map (\y => negate (fromInteger y)) (parseIntegerAux (unpack xs) 0)
else if (x == '+')
then map fromInteger (parseIntegerAux (unpack xs) (cast {from=Int} 0))
else map fromInteger (parseIntegerAux (unpack xs) (cast (ord x - ord '0')))
where
parseIntegerAux : List Char -> Integer -> Maybe Integer
parseIntegerAux [] acc = Just acc
parseIntegerAux (c :: cs) acc =
if (c >= '0' && c <= '9')
then parseIntegerAux cs ((acc * 10) + (cast ((ord c) - (ord '0'))))
else Nothing