{-# language Unsafe, GeneralizedNewtypeDeriving #-}
module D10.Char.Unsafe (D10 (D10_Unsafe)) where
import qualified D10.Predicate as Predicate
import Data.Char (chr, ord)
import Data.Hashable (Hashable)
import Data.Monoid (Endo (..))
newtype D10 =
D10_Unsafe Char
deriving (D10 -> D10 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: D10 -> D10 -> Bool
$c/= :: D10 -> D10 -> Bool
== :: D10 -> D10 -> Bool
$c== :: D10 -> D10 -> Bool
Eq, Eq D10
D10 -> D10 -> Bool
D10 -> D10 -> Ordering
D10 -> D10 -> D10
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
min :: D10 -> D10 -> D10
$cmin :: D10 -> D10 -> D10
max :: D10 -> D10 -> D10
$cmax :: D10 -> D10 -> D10
>= :: D10 -> D10 -> Bool
$c>= :: D10 -> D10 -> Bool
> :: D10 -> D10 -> Bool
$c> :: D10 -> D10 -> Bool
<= :: D10 -> D10 -> Bool
$c<= :: D10 -> D10 -> Bool
< :: D10 -> D10 -> Bool
$c< :: D10 -> D10 -> Bool
compare :: D10 -> D10 -> Ordering
$ccompare :: D10 -> D10 -> Ordering
Ord)
deriving newtype Eq D10
Int -> D10 -> Int
D10 -> Int
forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: D10 -> Int
$chash :: D10 -> Int
hashWithSalt :: Int -> D10 -> Int
$chashWithSalt :: Int -> D10 -> Int
Hashable
instance Bounded D10
where
minBound :: D10
minBound = Char -> D10
D10_Unsafe Char
'0'
maxBound :: D10
maxBound = Char -> D10
D10_Unsafe Char
'9'
instance Enum D10
where
fromEnum :: D10 -> Int
fromEnum :: D10 -> Int
fromEnum (D10_Unsafe Char
x) = Char -> Int
ord Char
x forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'0'
toEnum :: Int -> D10
toEnum :: Int -> D10
toEnum Int
x | Int -> Bool
Predicate.isD10Int Int
x = Char -> D10
D10_Unsafe (Int -> Char
chr (Int
x forall a. Num a => a -> a -> a
+ Char -> Int
ord Char
'0'))
| Bool
otherwise = forall a. HasCallStack => String -> a
error String
"d10 must be between 0 and 9"
enumFrom :: D10 -> [D10]
enumFrom :: D10 -> [D10]
enumFrom D10
x = forall a. Enum a => a -> a -> [a]
enumFromTo D10
x forall a. Bounded a => a
maxBound
enumFromThen :: D10 -> D10 -> [D10]
enumFromThen :: D10 -> D10 -> [D10]
enumFromThen D10
x D10
y = forall a. Enum a => a -> a -> a -> [a]
enumFromThenTo D10
x D10
y D10
bound
where
bound :: D10
bound | forall a. Enum a => a -> Int
fromEnum D10
y forall a. Ord a => a -> a -> Bool
>= forall a. Enum a => a -> Int
fromEnum D10
x = forall a. Bounded a => a
maxBound
| Bool
otherwise = forall a. Bounded a => a
minBound
succ :: D10 -> D10
succ :: D10 -> D10
succ (D10_Unsafe Char
'9') = forall a. HasCallStack => String -> a
error String
"D10 overflow"
succ (D10_Unsafe Char
x) = Char -> D10
D10_Unsafe (forall a. Enum a => a -> a
succ Char
x)
pred :: D10 -> D10
pred :: D10 -> D10
pred (D10_Unsafe Char
'0') = forall a. HasCallStack => String -> a
error String
"D10 underflow"
pred (D10_Unsafe Char
x) = Char -> D10
D10_Unsafe (forall a. Enum a => a -> a
pred Char
x)
instance Show D10 where
showsPrec :: Int -> D10 -> ShowS
showsPrec Int
_ D10
x = String -> ShowS
showString String
"[d10|" forall b c a. (b -> c) -> (a -> b) -> a -> c
. D10 -> ShowS
showsChar D10
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"|]"
showList :: [D10] -> ShowS
showList [D10]
xs = String -> ShowS
showString String
"[d10list|" forall b c a. (b -> c) -> (a -> b) -> a -> c
. [D10] -> ShowS
showsStr [D10]
xs forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"|]"
showsChar :: D10 -> ShowS
showsChar :: D10 -> ShowS
showsChar (D10_Unsafe Char
x) = Char -> ShowS
showChar Char
x
showsStr :: [D10] -> ShowS
showsStr :: [D10] -> ShowS
showsStr = forall a. Endo a -> a -> a
appEndo forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (forall a. (a -> a) -> Endo a
Endo forall b c a. (b -> c) -> (a -> b) -> a -> c
. D10 -> ShowS
showsChar)