@@ -0,0 +1,38 @@
1+module Data.String
2+
3+||| Convert a positive number string to a Num.
4+|||
5+||| ```idris example
6+||| parsePositive "123"
7+||| parsePositive {a=Int} " +123"
8+||| ```
9+parsePositive : Num a => String -> Maybe a
10+parsePositive s = parsePosTrimmed (trim s) where
11+ parsePosTrimmed s with (strM s)
12+ parsePosTrimmed "" | StrNil = Nothing
13+ parsePosTrimmed (strCons x xs) | (StrCons x xs) = if (x == '+') then map fromInteger (parsePosAux (unpack xs) 0)
14+ else map fromInteger (parsePosAux (unpack xs) (ord x - ord '0')) where
15+ parsePosAux : (List Char) -> Int -> Maybe Integer
16+ parsePosAux [] acc = Just (cast acc)
17+ parsePosAux (c :: cs) acc = if (c >= '0' && c <= '9') then parsePosAux cs ((acc * 10) + (ord c) - (ord '0'))
18+ else Nothing
19+
20+
21+||| Convert a number string to a Num.
22+|||
23+||| ```idris example
24+||| parseInteger " 123"
25+||| parseInteger {a=Int} " -123"
26+||| ```
27+parseInteger : (Num a, Neg a) => String -> Maybe a
28+parseInteger s = parseIntTrimmed (trim s) where
29+ parseIntTrimmed s with (strM s)
30+ parseIntTrimmed "" | StrNil = Nothing
31+ parseIntTrimmed (strCons x xs) | (StrCons x xs) = if (x == '-') then map (\y => negate (fromInteger y)) (parseIntegerAux (unpack xs) 0)
32+ else if (x == '+') then map fromInteger (parseIntegerAux (unpack xs) 0)
33+ else map fromInteger (parseIntegerAux (unpack xs) (ord x - ord '0')) where
34+ parseIntegerAux : (List Char) -> Int -> Maybe Integer
35+ parseIntegerAux [] acc = Just (cast acc)
36+ parseIntegerAux (c :: cs) acc = if (c >= '0' && c <= '9') then parseIntegerAux cs ((acc * 10) + (ord c) - (ord '0'))
37+ else Nothing
38+