module Text.Regex.Applicative.Common (
digit
, hexDigit
, signed
, decimal
, hexadecimal
) where
import Data.Char
import Data.List (foldl')
import Text.Regex.Applicative
digit :: Num a => RE Char a
digit :: RE Char a
digit = Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> a) -> (Char -> Int) -> Char -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
digitToInt (Char -> a) -> RE Char Char -> RE Char a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> RE Char Char
forall s. (s -> Bool) -> RE s s
psym Char -> Bool
isDigit
hexDigit :: Num a => RE Char a
hexDigit :: RE Char a
hexDigit = Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> a) -> (Char -> Int) -> Char -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
digitToInt (Char -> a) -> RE Char Char -> RE Char a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> RE Char Char
forall s. (s -> Bool) -> RE s s
psym Char -> Bool
isHexDigit
signed :: Num a => RE Char a -> RE Char a
signed :: RE Char a -> RE Char a
signed p :: RE Char a
p = RE Char (a -> a)
sign RE Char (a -> a) -> RE Char a -> RE Char a
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RE Char a
p
where
sign :: RE Char (a -> a)
sign = a -> a
forall a. a -> a
id (a -> a) -> RE Char Char -> RE Char (a -> a)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> RE Char Char
forall s. Eq s => s -> RE s s
sym '+'
RE Char (a -> a) -> RE Char (a -> a) -> RE Char (a -> a)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> a
forall a. Num a => a -> a
negate (a -> a) -> RE Char Char -> RE Char (a -> a)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> RE Char Char
forall s. Eq s => s -> RE s s
sym '-'
RE Char (a -> a) -> RE Char (a -> a) -> RE Char (a -> a)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (a -> a) -> RE Char (a -> a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> a
forall a. a -> a
id
decimal :: Num a => RE Char a
decimal :: RE Char a
decimal = (a -> a -> a) -> a -> [a] -> a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\d :: a
d i :: a
i -> a
da -> a -> a
forall a. Num a => a -> a -> a
*10 a -> a -> a
forall a. Num a => a -> a -> a
+ a
i) 0 ([a] -> a) -> RE Char [a] -> RE Char a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RE Char a -> RE Char [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some RE Char a
forall a. Num a => RE Char a
digit
hexadecimal :: Num a => RE Char a
hexadecimal :: RE Char a
hexadecimal = (a -> a -> a) -> a -> [a] -> a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\d :: a
d i :: a
i -> a
da -> a -> a
forall a. Num a => a -> a -> a
*16 a -> a -> a
forall a. Num a => a -> a -> a
+ a
i) 0 ([a] -> a) -> RE Char [a] -> RE Char a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RE Char a -> RE Char [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some RE Char a
forall a. Num a => RE Char a
hexDigit