{-# language Safe #-}
module D10.Safe.Conversions
(
d10Char, charD10Maybe, charD10Either, charD10Fail
, d10Str, strD10Maybe, strD10Either, strD10Fail
, strD10ListMaybe, strD10ListEither, strD10ListFail
, d10Nat, natD10Maybe, natD10Either, natD10Fail, natMod10
, d10Integer, integerD10Maybe, integerD10Either
, integerD10Fail, integerMod10
, d10Int, intD10Maybe, intD10Either, intD10Fail, intMod10
, d10Num, integralD10Maybe, integralD10Either
, integralD10Fail, integralMod10
) where
import D10.Safe.Type (D10 (..))
import Control.Monad.Fail (MonadFail (fail))
import Numeric.Natural (Natural)
import Prelude hiding (fail)
d10Char :: D10 -> Char
d10Char :: D10 -> Char
d10Char D10
x =
case D10
x of
D10
D0 -> Char
'0'
D10
D1 -> Char
'1'
D10
D2 -> Char
'2'
D10
D3 -> Char
'3'
D10
D4 -> Char
'4'
D10
D5 -> Char
'5'
D10
D6 -> Char
'6'
D10
D7 -> Char
'7'
D10
D8 -> Char
'8'
D10
D9 -> Char
'9'
d10Str :: D10 -> String
d10Str :: D10 -> String
d10Str D10
x = [D10 -> Char
d10Char D10
x]
d10Nat :: D10 -> Natural
d10Nat :: D10 -> Natural
d10Nat = D10 -> Natural
forall a. Num a => D10 -> a
d10Num
d10Integer :: D10 -> Integer
d10Integer :: D10 -> Integer
d10Integer = D10 -> Integer
forall a. Num a => D10 -> a
d10Num
d10Int :: D10 -> Int
d10Int :: D10 -> Int
d10Int = D10 -> Int
forall a. Num a => D10 -> a
d10Num
d10Num :: Num a => D10 -> a
d10Num :: D10 -> a
d10Num D10
x =
case D10
x of
D10
D0 -> a
0
D10
D1 -> a
1
D10
D2 -> a
2
D10
D3 -> a
3
D10
D4 -> a
4
D10
D5 -> a
5
D10
D6 -> a
6
D10
D7 -> a
7
D10
D8 -> a
8
D10
D9 -> a
9
natMod10 :: Natural -> D10
natMod10 :: Natural -> D10
natMod10 = Natural -> D10
forall a. Integral a => a -> D10
integralMod10
integerMod10 :: Integer -> D10
integerMod10 :: Integer -> D10
integerMod10 = Integer -> D10
forall a. Integral a => a -> D10
integralMod10
intMod10 :: Int -> D10
intMod10 :: Int -> D10
intMod10 = Int -> D10
forall a. Integral a => a -> D10
integralMod10
integralMod10 :: Integral a => a -> D10
integralMod10 :: a -> D10
integralMod10 a
x =
case (a
x a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
10) of
a
0 -> D10
D0
a
1 -> D10
D1
a
2 -> D10
D2
a
3 -> D10
D3
a
4 -> D10
D4
a
5 -> D10
D5
a
6 -> D10
D6
a
7 -> D10
D7
a
8 -> D10
D8
a
9 -> D10
D9
a
_ -> String -> D10
forall a. HasCallStack => String -> a
error String
"x `mod` 10 is not between 0 and 9"
charD10Maybe :: Char -> Maybe D10
charD10Maybe :: Char -> Maybe D10
charD10Maybe Char
x =
case Char
x of
Char
'0' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D0
Char
'1' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D1
Char
'2' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D2
Char
'3' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D3
Char
'4' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D4
Char
'5' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D5
Char
'6' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D6
Char
'7' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D7
Char
'8' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D8
Char
'9' -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D9
Char
_ -> Maybe D10
forall a. Maybe a
Nothing
strD10Maybe :: String -> Maybe D10
strD10Maybe :: String -> Maybe D10
strD10Maybe [Char
x] = Char -> Maybe D10
charD10Maybe Char
x
strD10Maybe String
_ = Maybe D10
forall a. Maybe a
Nothing
strD10ListMaybe :: String -> Maybe [D10]
strD10ListMaybe :: String -> Maybe [D10]
strD10ListMaybe = (Char -> Maybe D10) -> String -> Maybe [D10]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> Maybe D10
charD10Maybe
natD10Maybe :: Natural -> Maybe D10
natD10Maybe :: Natural -> Maybe D10
natD10Maybe = Natural -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe
integerD10Maybe :: Integer -> Maybe D10
integerD10Maybe :: Integer -> Maybe D10
integerD10Maybe = Integer -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe
intD10Maybe :: Int -> Maybe D10
intD10Maybe :: Int -> Maybe D10
intD10Maybe = Int -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe
integralD10Maybe :: Integral a => a -> Maybe D10
integralD10Maybe :: a -> Maybe D10
integralD10Maybe a
x =
case a
x of
a
0 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D0
a
1 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D1
a
2 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D2
a
3 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D3
a
4 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D4
a
5 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D5
a
6 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D6
a
7 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D7
a
8 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D8
a
9 -> D10 -> Maybe D10
forall a. a -> Maybe a
Just D10
D9
a
_ -> Maybe D10
forall a. Maybe a
Nothing
charD10Either :: Char -> Either String D10
charD10Either :: Char -> Either String D10
charD10Either Char
x =
case Char
x of
Char
'0' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D0
Char
'1' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D1
Char
'2' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D2
Char
'3' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D3
Char
'4' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D4
Char
'5' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D5
Char
'6' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D6
Char
'7' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D7
Char
'8' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D8
Char
'9' -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D9
Char
_ -> String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be between 0 and 9"
strD10Either :: String -> Either String D10
strD10Either :: String -> Either String D10
strD10Either [Char
x] = Char -> Either String D10
charD10Either Char
x
strD10Either String
_ = String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be a single character"
strD10ListEither :: String -> Either String [D10]
strD10ListEither :: String -> Either String [D10]
strD10ListEither = (Char -> Either String D10) -> String -> Either String [D10]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> Either String D10
charD10Either
natD10Either :: Natural -> Either String D10
natD10Either :: Natural -> Either String D10
natD10Either Natural
x =
case Natural
x of
Natural
0 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D0
Natural
1 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D1
Natural
2 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D2
Natural
3 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D3
Natural
4 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D4
Natural
5 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D5
Natural
6 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D6
Natural
7 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D7
Natural
8 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D8
Natural
9 -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
D9
Natural
_ -> String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be less than 10"
integerD10Either :: Integer -> Either String D10
integerD10Either :: Integer -> Either String D10
integerD10Either = Integer -> Either String D10
forall a. Integral a => a -> Either String D10
integralD10Either
intD10Either :: Int -> Either String D10
intD10Either :: Int -> Either String D10
intD10Either = Int -> Either String D10
forall a. Integral a => a -> Either String D10
integralD10Either
integralD10Either :: Integral a => a -> Either String D10
integralD10Either :: a -> Either String D10
integralD10Either a
x =
case (a -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x) of
Just D10
y -> D10 -> Either String D10
forall a b. b -> Either a b
Right D10
y
Maybe D10
Nothing -> String -> Either String D10
forall a b. a -> Either a b
Left String
"d10 must be between 0 and 9"
charD10Fail :: MonadFail m => Char -> m D10
charD10Fail :: Char -> m D10
charD10Fail Char
x =
case Char
x of
Char
'0' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D0
Char
'1' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D1
Char
'2' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D2
Char
'3' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D3
Char
'4' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D4
Char
'5' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D5
Char
'6' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D6
Char
'7' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D7
Char
'8' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D8
Char
'9' -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D9
Char
_ -> String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be between 0 and 9"
strD10Fail :: MonadFail m => String -> m D10
strD10Fail :: String -> m D10
strD10Fail [Char
x] = Char -> m D10
forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail Char
x
strD10Fail String
_ = String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be a single character"
strD10ListFail :: MonadFail m => String -> m [D10]
strD10ListFail :: String -> m [D10]
strD10ListFail = (Char -> m D10) -> String -> m [D10]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Char -> m D10
forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail
natD10Fail :: MonadFail m => Natural -> m D10
natD10Fail :: Natural -> m D10
natD10Fail Natural
x =
case Natural
x of
Natural
0 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D0
Natural
1 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D1
Natural
2 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D2
Natural
3 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D3
Natural
4 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D4
Natural
5 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D5
Natural
6 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D6
Natural
7 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D7
Natural
8 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D8
Natural
9 -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
D9
Natural
_ -> String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be less than 10"
integerD10Fail :: MonadFail m => Integer -> m D10
integerD10Fail :: Integer -> m D10
integerD10Fail = Integer -> m D10
forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail
intD10Fail :: MonadFail m => Int -> m D10
intD10Fail :: Int -> m D10
intD10Fail = Int -> m D10
forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail
integralD10Fail :: (Integral a, MonadFail m) => a -> m D10
integralD10Fail :: a -> m D10
integralD10Fail a
x =
case (a -> Maybe D10
forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x) of
Just D10
y -> D10 -> m D10
forall (m :: * -> *) a. Monad m => a -> m a
return D10
y
Maybe D10
Nothing -> String -> m D10
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be between 0 and 9"