babynf-0.1.0.2: lib/Data/BAByNF/Util/Decimal.hs
module Data.BAByNF.Util.Decimal
( Digit (..)
, Seq (..)
, val
, toNum
, fromVal
, toChar
) where
data Digit = D0
| D1
| D2
| D3
| D4
| D5
| D6
| D7
| D8
| D9
deriving (Eq, Ord)
newtype Seq = Seq [Digit] deriving Eq
val :: Integral a => Digit -> a
val D0 = 0
val D1 = 1
val D2 = 2
val D3 = 3
val D4 = 4
val D5 = 5
val D6 = 6
val D7 = 7
val D8 = 8
val D9 = 9
toNum :: Integral a => Seq -> a
toNum (Seq digits) = toNum' digits 0
where toNum' [] acc = acc
toNum' (d : ds) acc =
let newAcc = (acc * 10) + val d
in toNum' ds newAcc
fromVal :: Integral a => a -> Maybe Digit
fromVal 0 = Just D0
fromVal 1 = Just D1
fromVal 2 = Just D2
fromVal 3 = Just D3
fromVal 4 = Just D4
fromVal 5 = Just D5
fromVal 6 = Just D6
fromVal 7 = Just D7
fromVal 8 = Just D8
fromVal 9 = Just D9
fromVal _ = Nothing
instance Show Seq where
show (Seq x) = map toChar x
toChar :: Digit -> Char
toChar d = case d of
D0 -> '0'
D1 -> '1'
D2 -> '2'
D3 -> '3'
D4 -> '4'
D5 -> '5'
D6 -> '6'
D7 -> '7'
D8 -> '8'
D9 -> '9'