{-# 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 = forall a. Num a => D10 -> a
d10Num
d10Integer :: D10 -> Integer
d10Integer :: D10 -> Integer
d10Integer = forall a. Num a => D10 -> a
d10Num
d10Int :: D10 -> Int
d10Int :: D10 -> Int
d10Int = forall a. Num a => D10 -> a
d10Num
d10Num :: Num a => D10 -> a
d10Num :: forall a. Num a => 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 = forall a. Integral a => a -> D10
integralMod10
integerMod10 :: Integer -> D10
integerMod10 :: Integer -> D10
integerMod10 = forall a. Integral a => a -> D10
integralMod10
intMod10 :: Int -> D10
intMod10 :: Int -> D10
intMod10 = forall a. Integral a => a -> D10
integralMod10
integralMod10 :: Integral a => a -> D10
integralMod10 :: forall a. Integral a => a -> D10
integralMod10 a
x =
case (a
x 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
_ -> 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' -> forall a. a -> Maybe a
Just D10
D0
Char
'1' -> forall a. a -> Maybe a
Just D10
D1
Char
'2' -> forall a. a -> Maybe a
Just D10
D2
Char
'3' -> forall a. a -> Maybe a
Just D10
D3
Char
'4' -> forall a. a -> Maybe a
Just D10
D4
Char
'5' -> forall a. a -> Maybe a
Just D10
D5
Char
'6' -> forall a. a -> Maybe a
Just D10
D6
Char
'7' -> forall a. a -> Maybe a
Just D10
D7
Char
'8' -> forall a. a -> Maybe a
Just D10
D8
Char
'9' -> forall a. a -> Maybe a
Just D10
D9
Char
_ -> forall a. Maybe a
Nothing
strD10Maybe :: String -> Maybe D10
strD10Maybe :: String -> Maybe D10
strD10Maybe [Char
x] = Char -> Maybe D10
charD10Maybe Char
x
strD10Maybe String
_ = forall a. Maybe a
Nothing
strD10ListMaybe :: String -> Maybe [D10]
strD10ListMaybe :: String -> Maybe [D10]
strD10ListMaybe = 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 = forall a. Integral a => a -> Maybe D10
integralD10Maybe
integerD10Maybe :: Integer -> Maybe D10
integerD10Maybe :: Integer -> Maybe D10
integerD10Maybe = forall a. Integral a => a -> Maybe D10
integralD10Maybe
intD10Maybe :: Int -> Maybe D10
intD10Maybe :: Int -> Maybe D10
intD10Maybe = forall a. Integral a => a -> Maybe D10
integralD10Maybe
integralD10Maybe :: Integral a => a -> Maybe D10
integralD10Maybe :: forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x =
case a
x of
a
0 -> forall a. a -> Maybe a
Just D10
D0
a
1 -> forall a. a -> Maybe a
Just D10
D1
a
2 -> forall a. a -> Maybe a
Just D10
D2
a
3 -> forall a. a -> Maybe a
Just D10
D3
a
4 -> forall a. a -> Maybe a
Just D10
D4
a
5 -> forall a. a -> Maybe a
Just D10
D5
a
6 -> forall a. a -> Maybe a
Just D10
D6
a
7 -> forall a. a -> Maybe a
Just D10
D7
a
8 -> forall a. a -> Maybe a
Just D10
D8
a
9 -> forall a. a -> Maybe a
Just D10
D9
a
_ -> forall a. Maybe a
Nothing
charD10Either :: Char -> Either String D10
charD10Either :: Char -> Either String D10
charD10Either Char
x =
case Char
x of
Char
'0' -> forall a b. b -> Either a b
Right D10
D0
Char
'1' -> forall a b. b -> Either a b
Right D10
D1
Char
'2' -> forall a b. b -> Either a b
Right D10
D2
Char
'3' -> forall a b. b -> Either a b
Right D10
D3
Char
'4' -> forall a b. b -> Either a b
Right D10
D4
Char
'5' -> forall a b. b -> Either a b
Right D10
D5
Char
'6' -> forall a b. b -> Either a b
Right D10
D6
Char
'7' -> forall a b. b -> Either a b
Right D10
D7
Char
'8' -> forall a b. b -> Either a b
Right D10
D8
Char
'9' -> forall a b. b -> Either a b
Right D10
D9
Char
_ -> 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
_ = 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 = 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 -> forall a b. b -> Either a b
Right D10
D0
Natural
1 -> forall a b. b -> Either a b
Right D10
D1
Natural
2 -> forall a b. b -> Either a b
Right D10
D2
Natural
3 -> forall a b. b -> Either a b
Right D10
D3
Natural
4 -> forall a b. b -> Either a b
Right D10
D4
Natural
5 -> forall a b. b -> Either a b
Right D10
D5
Natural
6 -> forall a b. b -> Either a b
Right D10
D6
Natural
7 -> forall a b. b -> Either a b
Right D10
D7
Natural
8 -> forall a b. b -> Either a b
Right D10
D8
Natural
9 -> forall a b. b -> Either a b
Right D10
D9
Natural
_ -> 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 = forall a. Integral a => a -> Either String D10
integralD10Either
intD10Either :: Int -> Either String D10
intD10Either :: Int -> Either String D10
intD10Either = forall a. Integral a => a -> Either String D10
integralD10Either
integralD10Either :: Integral a => a -> Either String D10
integralD10Either :: forall a. Integral a => a -> Either String D10
integralD10Either a
x =
case (forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x) of
Just D10
y -> forall a b. b -> Either a b
Right D10
y
Maybe D10
Nothing -> forall a b. a -> Either a b
Left String
"d10 must be between 0 and 9"
charD10Fail :: MonadFail m => Char -> m D10
charD10Fail :: forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail Char
x =
case Char
x of
Char
'0' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D0
Char
'1' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D1
Char
'2' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D2
Char
'3' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D3
Char
'4' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D4
Char
'5' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D5
Char
'6' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D6
Char
'7' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D7
Char
'8' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D8
Char
'9' -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D9
Char
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be between 0 and 9"
strD10Fail :: MonadFail m => String -> m D10
strD10Fail :: forall (m :: * -> *). MonadFail m => String -> m D10
strD10Fail [Char
x] = forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail Char
x
strD10Fail String
_ = forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be a single character"
strD10ListFail :: MonadFail m => String -> m [D10]
strD10ListFail :: forall (m :: * -> *). MonadFail m => String -> m [D10]
strD10ListFail = forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (m :: * -> *). MonadFail m => Char -> m D10
charD10Fail
natD10Fail :: MonadFail m => Natural -> m D10
natD10Fail :: forall (m :: * -> *). MonadFail m => Natural -> m D10
natD10Fail Natural
x =
case Natural
x of
Natural
0 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D0
Natural
1 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D1
Natural
2 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D2
Natural
3 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D3
Natural
4 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D4
Natural
5 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D5
Natural
6 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D6
Natural
7 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D7
Natural
8 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D8
Natural
9 -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
D9
Natural
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be less than 10"
integerD10Fail :: MonadFail m => Integer -> m D10
integerD10Fail :: forall (m :: * -> *). MonadFail m => Integer -> m D10
integerD10Fail = forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail
intD10Fail :: MonadFail m => Int -> m D10
intD10Fail :: forall (m :: * -> *). MonadFail m => Int -> m D10
intD10Fail = forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail
integralD10Fail :: (Integral a, MonadFail m) => a -> m D10
integralD10Fail :: forall a (m :: * -> *). (Integral a, MonadFail m) => a -> m D10
integralD10Fail a
x =
case (forall a. Integral a => a -> Maybe D10
integralD10Maybe a
x) of
Just D10
y -> forall (m :: * -> *) a. Monad m => a -> m a
return D10
y
Maybe D10
Nothing -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"d10 must be between 0 and 9"