{-# LANGUAGE DeriveGeneric #-}

module ROC.ID.Digit
  ( Digit (..)
  , parseDigit
  ) where

import GHC.Generics
    ( Generic )

import ROC.ID.Utilities

-- | Represents a single decimal digit in the range 0 to 9.
--
data Digit
  = D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9
  deriving (Digit
Digit -> Digit -> Bounded Digit
forall a. a -> a -> Bounded a
$cminBound :: Digit
minBound :: Digit
$cmaxBound :: Digit
maxBound :: Digit
Bounded, Int -> Digit
Digit -> Int
Digit -> [Digit]
Digit -> Digit
Digit -> Digit -> [Digit]
Digit -> Digit -> Digit -> [Digit]
(Digit -> Digit)
-> (Digit -> Digit)
-> (Int -> Digit)
-> (Digit -> Int)
-> (Digit -> [Digit])
-> (Digit -> Digit -> [Digit])
-> (Digit -> Digit -> [Digit])
-> (Digit -> Digit -> Digit -> [Digit])
-> Enum Digit
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Digit -> Digit
succ :: Digit -> Digit
$cpred :: Digit -> Digit
pred :: Digit -> Digit
$ctoEnum :: Int -> Digit
toEnum :: Int -> Digit
$cfromEnum :: Digit -> Int
fromEnum :: Digit -> Int
$cenumFrom :: Digit -> [Digit]
enumFrom :: Digit -> [Digit]
$cenumFromThen :: Digit -> Digit -> [Digit]
enumFromThen :: Digit -> Digit -> [Digit]
$cenumFromTo :: Digit -> Digit -> [Digit]
enumFromTo :: Digit -> Digit -> [Digit]
$cenumFromThenTo :: Digit -> Digit -> Digit -> [Digit]
enumFromThenTo :: Digit -> Digit -> Digit -> [Digit]
Enum, Digit -> Digit -> Bool
(Digit -> Digit -> Bool) -> (Digit -> Digit -> Bool) -> Eq Digit
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Digit -> Digit -> Bool
== :: Digit -> Digit -> Bool
$c/= :: Digit -> Digit -> Bool
/= :: Digit -> Digit -> Bool
Eq, (forall x. Digit -> Rep Digit x)
-> (forall x. Rep Digit x -> Digit) -> Generic Digit
forall x. Rep Digit x -> Digit
forall x. Digit -> Rep Digit x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Digit -> Rep Digit x
from :: forall x. Digit -> Rep Digit x
$cto :: forall x. Rep Digit x -> Digit
to :: forall x. Rep Digit x -> Digit
Generic, Eq Digit
Eq Digit =>
(Digit -> Digit -> Ordering)
-> (Digit -> Digit -> Bool)
-> (Digit -> Digit -> Bool)
-> (Digit -> Digit -> Bool)
-> (Digit -> Digit -> Bool)
-> (Digit -> Digit -> Digit)
-> (Digit -> Digit -> Digit)
-> Ord Digit
Digit -> Digit -> Bool
Digit -> Digit -> Ordering
Digit -> Digit -> Digit
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Digit -> Digit -> Ordering
compare :: Digit -> Digit -> Ordering
$c< :: Digit -> Digit -> Bool
< :: Digit -> Digit -> Bool
$c<= :: Digit -> Digit -> Bool
<= :: Digit -> Digit -> Bool
$c> :: Digit -> Digit -> Bool
> :: Digit -> Digit -> Bool
$c>= :: Digit -> Digit -> Bool
>= :: Digit -> Digit -> Bool
$cmax :: Digit -> Digit -> Digit
max :: Digit -> Digit -> Digit
$cmin :: Digit -> Digit -> Digit
min :: Digit -> Digit -> Digit
Ord)

instance Show Digit where show :: Digit -> String
show = Int -> String
forall a. Show a => a -> String
show (Int -> String) -> (Digit -> Int) -> Digit -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Digit -> Int
forall a. Enum a => a -> Int
fromEnum

parseDigit :: Char -> Maybe Digit
parseDigit :: Char -> Maybe Digit
parseDigit Char
c = String -> Maybe Int
forall a. Read a => String -> Maybe a
maybeRead [Char
c] Maybe Int -> (Int -> Maybe Digit) -> Maybe Digit
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Int -> Maybe Digit
forall a. (Bounded a, Enum a) => Int -> Maybe a
maybeToEnum