@@ -0,0 +1,54 @@
3+||| Convert a positive number string to a Num.
6+||| parsePositive "123"
9+||| parsePositive {a=Int} " +123"
11+parsePositive : Num a => String -> Maybe a
12+parsePositive s = parsePosTrimmed (trim s)
14+ parsePosTrimmed s with (strM s)
15+ parsePosTrimmed "" | StrNil = Nothing
16+ parsePosTrimmed (strCons x xs) | (StrCons x xs) =
18+ then map fromInteger (parsePosAux (unpack xs) 0)
19+ else map fromInteger (parsePosAux (unpack xs) (cast (ord x - ord '0')))
21+ parsePosAux : List Char -> Integer -> Maybe Integer
22+ parsePosAux [] acc = Just acc
23+ parsePosAux (c :: cs) acc =
24+ if (c >= '0' && c <= '9')
25+ then parsePosAux cs ((acc * 10) + (cast ((ord c) - (ord '0'))))
29+||| Convert a number string to a Num.
32+||| parseInteger " 123"
35+||| parseInteger {a=Int} " -123"
37+parseInteger : (Num a, Neg a) => String -> Maybe a
38+parseInteger s = parseIntTrimmed (trim s)
40+ parseIntTrimmed s with (strM s)
41+ parseIntTrimmed "" | StrNil = Nothing
42+ parseIntTrimmed (strCons x xs) | (StrCons x xs) =
44+ then map (\y => negate (fromInteger y)) (parseIntegerAux (unpack xs) 0)
46+ then map fromInteger (parseIntegerAux (unpack xs) (cast {from=Int} 0))
47+ else map fromInteger (parseIntegerAux (unpack xs) (cast (ord x - ord '0')))
49+ parseIntegerAux : List Char -> Integer -> Maybe Integer
50+ parseIntegerAux [] acc = Just acc
51+ parseIntegerAux (c :: cs) acc =
52+ if (c >= '0' && c <= '9')
53+ then parseIntegerAux cs ((acc * 10) + (cast ((ord c) - (ord '0'))))