{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Taiwan.ID.Gender
( Gender (..)
, toText
, generate
) where
import Control.Monad.Random.Class
( MonadRandom (..) )
import Data.Finitary
( Finitary )
import Data.Text
( Text )
import GHC.Generics
( Generic )
import Taiwan.ID.Language
( Language (..) )
import Taiwan.ID.Utilities
( randomFinitary )
data Gender = Male | Female
deriving stock (Gender
Gender -> Gender -> Bounded Gender
forall a. a -> a -> Bounded a
$cminBound :: Gender
minBound :: Gender
$cmaxBound :: Gender
maxBound :: Gender
Bounded, Int -> Gender
Gender -> Int
Gender -> [Gender]
Gender -> Gender
Gender -> Gender -> [Gender]
Gender -> Gender -> Gender -> [Gender]
(Gender -> Gender)
-> (Gender -> Gender)
-> (Int -> Gender)
-> (Gender -> Int)
-> (Gender -> [Gender])
-> (Gender -> Gender -> [Gender])
-> (Gender -> Gender -> [Gender])
-> (Gender -> Gender -> Gender -> [Gender])
-> Enum Gender
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 :: Gender -> Gender
succ :: Gender -> Gender
$cpred :: Gender -> Gender
pred :: Gender -> Gender
$ctoEnum :: Int -> Gender
toEnum :: Int -> Gender
$cfromEnum :: Gender -> Int
fromEnum :: Gender -> Int
$cenumFrom :: Gender -> [Gender]
enumFrom :: Gender -> [Gender]
$cenumFromThen :: Gender -> Gender -> [Gender]
enumFromThen :: Gender -> Gender -> [Gender]
$cenumFromTo :: Gender -> Gender -> [Gender]
enumFromTo :: Gender -> Gender -> [Gender]
$cenumFromThenTo :: Gender -> Gender -> Gender -> [Gender]
enumFromThenTo :: Gender -> Gender -> Gender -> [Gender]
Enum, Gender -> Gender -> Bool
(Gender -> Gender -> Bool)
-> (Gender -> Gender -> Bool) -> Eq Gender
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Gender -> Gender -> Bool
== :: Gender -> Gender -> Bool
$c/= :: Gender -> Gender -> Bool
/= :: Gender -> Gender -> Bool
Eq, (forall x. Gender -> Rep Gender x)
-> (forall x. Rep Gender x -> Gender) -> Generic Gender
forall x. Rep Gender x -> Gender
forall x. Gender -> Rep Gender x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Gender -> Rep Gender x
from :: forall x. Gender -> Rep Gender x
$cto :: forall x. Rep Gender x -> Gender
to :: forall x. Rep Gender x -> Gender
Generic, Eq Gender
Eq Gender =>
(Gender -> Gender -> Ordering)
-> (Gender -> Gender -> Bool)
-> (Gender -> Gender -> Bool)
-> (Gender -> Gender -> Bool)
-> (Gender -> Gender -> Bool)
-> (Gender -> Gender -> Gender)
-> (Gender -> Gender -> Gender)
-> Ord Gender
Gender -> Gender -> Bool
Gender -> Gender -> Ordering
Gender -> Gender -> Gender
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 :: Gender -> Gender -> Ordering
compare :: Gender -> Gender -> Ordering
$c< :: Gender -> Gender -> Bool
< :: Gender -> Gender -> Bool
$c<= :: Gender -> Gender -> Bool
<= :: Gender -> Gender -> Bool
$c> :: Gender -> Gender -> Bool
> :: Gender -> Gender -> Bool
$c>= :: Gender -> Gender -> Bool
>= :: Gender -> Gender -> Bool
$cmax :: Gender -> Gender -> Gender
max :: Gender -> Gender -> Gender
$cmin :: Gender -> Gender -> Gender
min :: Gender -> Gender -> Gender
Ord, ReadPrec [Gender]
ReadPrec Gender
Int -> ReadS Gender
ReadS [Gender]
(Int -> ReadS Gender)
-> ReadS [Gender]
-> ReadPrec Gender
-> ReadPrec [Gender]
-> Read Gender
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Gender
readsPrec :: Int -> ReadS Gender
$creadList :: ReadS [Gender]
readList :: ReadS [Gender]
$creadPrec :: ReadPrec Gender
readPrec :: ReadPrec Gender
$creadListPrec :: ReadPrec [Gender]
readListPrec :: ReadPrec [Gender]
Read, Int -> Gender -> ShowS
[Gender] -> ShowS
Gender -> String
(Int -> Gender -> ShowS)
-> (Gender -> String) -> ([Gender] -> ShowS) -> Show Gender
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Gender -> ShowS
showsPrec :: Int -> Gender -> ShowS
$cshow :: Gender -> String
show :: Gender -> String
$cshowList :: [Gender] -> ShowS
showList :: [Gender] -> ShowS
Show)
deriving anyclass Eq Gender
KnownNat (Cardinality Gender)
(Eq Gender, KnownNat (Cardinality Gender)) =>
(Finite (Cardinality Gender) -> Gender)
-> (Gender -> Finite (Cardinality Gender))
-> ((1 <= Cardinality Gender) => Gender)
-> ((1 <= Cardinality Gender) => Gender)
-> (Gender -> Maybe Gender)
-> (Gender -> Maybe Gender)
-> Finitary Gender
(1 <= Cardinality Gender) => Gender
Finite (Cardinality Gender) -> Gender
Gender -> Maybe Gender
Gender -> Finite (Cardinality Gender)
forall a.
(Eq a, KnownNat (Cardinality a)) =>
(Finite (Cardinality a) -> a)
-> (a -> Finite (Cardinality a))
-> ((1 <= Cardinality a) => a)
-> ((1 <= Cardinality a) => a)
-> (a -> Maybe a)
-> (a -> Maybe a)
-> Finitary a
$cfromFinite :: Finite (Cardinality Gender) -> Gender
fromFinite :: Finite (Cardinality Gender) -> Gender
$ctoFinite :: Gender -> Finite (Cardinality Gender)
toFinite :: Gender -> Finite (Cardinality Gender)
$cstart :: (1 <= Cardinality Gender) => Gender
start :: (1 <= Cardinality Gender) => Gender
$cend :: (1 <= Cardinality Gender) => Gender
end :: (1 <= Cardinality Gender) => Gender
$cprevious :: Gender -> Maybe Gender
previous :: Gender -> Maybe Gender
$cnext :: Gender -> Maybe Gender
next :: Gender -> Maybe Gender
Finitary
toText :: Language -> Gender -> Text
toText :: Language -> Gender -> Text
toText = \case
Language
English -> Gender -> Text
toTextEnglish
Language
Chinese -> Gender -> Text
toTextChinese
toTextEnglish :: Gender -> Text
toTextEnglish :: Gender -> Text
toTextEnglish = \case
Gender
Male -> Text
"Male"
Gender
Female -> Text
"Female"
toTextChinese :: Gender -> Text
toTextChinese :: Gender -> Text
toTextChinese = \case
Gender
Male -> Text
"男性"
Gender
Female -> Text
"女性"
generate :: MonadRandom m => m Gender
generate :: forall (m :: * -> *). MonadRandom m => m Gender
generate = m Gender
forall (m :: * -> *) a.
(MonadRandom m, Finitary a, 1 <= Cardinality a) =>
m a
randomFinitary