{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}

module Taiwan.ID.Issuer
  ( Issuer (..)
  , 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 (English, Chinese) )
import Taiwan.ID.Utilities
  ( randomFinitary )

-- | A government authority that issues identification numbers.
--
data Issuer
  = HouseholdRegistrationOffice
  | NationalImmigrationAgency
  deriving stock (Issuer
Issuer -> Issuer -> Bounded Issuer
forall a. a -> a -> Bounded a
$cminBound :: Issuer
minBound :: Issuer
$cmaxBound :: Issuer
maxBound :: Issuer
Bounded, Int -> Issuer
Issuer -> Int
Issuer -> [Issuer]
Issuer -> Issuer
Issuer -> Issuer -> [Issuer]
Issuer -> Issuer -> Issuer -> [Issuer]
(Issuer -> Issuer)
-> (Issuer -> Issuer)
-> (Int -> Issuer)
-> (Issuer -> Int)
-> (Issuer -> [Issuer])
-> (Issuer -> Issuer -> [Issuer])
-> (Issuer -> Issuer -> [Issuer])
-> (Issuer -> Issuer -> Issuer -> [Issuer])
-> Enum Issuer
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 :: Issuer -> Issuer
succ :: Issuer -> Issuer
$cpred :: Issuer -> Issuer
pred :: Issuer -> Issuer
$ctoEnum :: Int -> Issuer
toEnum :: Int -> Issuer
$cfromEnum :: Issuer -> Int
fromEnum :: Issuer -> Int
$cenumFrom :: Issuer -> [Issuer]
enumFrom :: Issuer -> [Issuer]
$cenumFromThen :: Issuer -> Issuer -> [Issuer]
enumFromThen :: Issuer -> Issuer -> [Issuer]
$cenumFromTo :: Issuer -> Issuer -> [Issuer]
enumFromTo :: Issuer -> Issuer -> [Issuer]
$cenumFromThenTo :: Issuer -> Issuer -> Issuer -> [Issuer]
enumFromThenTo :: Issuer -> Issuer -> Issuer -> [Issuer]
Enum, Issuer -> Issuer -> Bool
(Issuer -> Issuer -> Bool)
-> (Issuer -> Issuer -> Bool) -> Eq Issuer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Issuer -> Issuer -> Bool
== :: Issuer -> Issuer -> Bool
$c/= :: Issuer -> Issuer -> Bool
/= :: Issuer -> Issuer -> Bool
Eq, Eq Issuer
Eq Issuer =>
(Issuer -> Issuer -> Ordering)
-> (Issuer -> Issuer -> Bool)
-> (Issuer -> Issuer -> Bool)
-> (Issuer -> Issuer -> Bool)
-> (Issuer -> Issuer -> Bool)
-> (Issuer -> Issuer -> Issuer)
-> (Issuer -> Issuer -> Issuer)
-> Ord Issuer
Issuer -> Issuer -> Bool
Issuer -> Issuer -> Ordering
Issuer -> Issuer -> Issuer
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 :: Issuer -> Issuer -> Ordering
compare :: Issuer -> Issuer -> Ordering
$c< :: Issuer -> Issuer -> Bool
< :: Issuer -> Issuer -> Bool
$c<= :: Issuer -> Issuer -> Bool
<= :: Issuer -> Issuer -> Bool
$c> :: Issuer -> Issuer -> Bool
> :: Issuer -> Issuer -> Bool
$c>= :: Issuer -> Issuer -> Bool
>= :: Issuer -> Issuer -> Bool
$cmax :: Issuer -> Issuer -> Issuer
max :: Issuer -> Issuer -> Issuer
$cmin :: Issuer -> Issuer -> Issuer
min :: Issuer -> Issuer -> Issuer
Ord, (forall x. Issuer -> Rep Issuer x)
-> (forall x. Rep Issuer x -> Issuer) -> Generic Issuer
forall x. Rep Issuer x -> Issuer
forall x. Issuer -> Rep Issuer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Issuer -> Rep Issuer x
from :: forall x. Issuer -> Rep Issuer x
$cto :: forall x. Rep Issuer x -> Issuer
to :: forall x. Rep Issuer x -> Issuer
Generic, ReadPrec [Issuer]
ReadPrec Issuer
Int -> ReadS Issuer
ReadS [Issuer]
(Int -> ReadS Issuer)
-> ReadS [Issuer]
-> ReadPrec Issuer
-> ReadPrec [Issuer]
-> Read Issuer
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Issuer
readsPrec :: Int -> ReadS Issuer
$creadList :: ReadS [Issuer]
readList :: ReadS [Issuer]
$creadPrec :: ReadPrec Issuer
readPrec :: ReadPrec Issuer
$creadListPrec :: ReadPrec [Issuer]
readListPrec :: ReadPrec [Issuer]
Read, Int -> Issuer -> ShowS
[Issuer] -> ShowS
Issuer -> String
(Int -> Issuer -> ShowS)
-> (Issuer -> String) -> ([Issuer] -> ShowS) -> Show Issuer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Issuer -> ShowS
showsPrec :: Int -> Issuer -> ShowS
$cshow :: Issuer -> String
show :: Issuer -> String
$cshowList :: [Issuer] -> ShowS
showList :: [Issuer] -> ShowS
Show)
  deriving anyclass Eq Issuer
KnownNat (Cardinality Issuer)
(Eq Issuer, KnownNat (Cardinality Issuer)) =>
(Finite (Cardinality Issuer) -> Issuer)
-> (Issuer -> Finite (Cardinality Issuer))
-> ((1 <= Cardinality Issuer) => Issuer)
-> ((1 <= Cardinality Issuer) => Issuer)
-> (Issuer -> Maybe Issuer)
-> (Issuer -> Maybe Issuer)
-> Finitary Issuer
(1 <= Cardinality Issuer) => Issuer
Finite (Cardinality Issuer) -> Issuer
Issuer -> Maybe Issuer
Issuer -> Finite (Cardinality Issuer)
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 Issuer) -> Issuer
fromFinite :: Finite (Cardinality Issuer) -> Issuer
$ctoFinite :: Issuer -> Finite (Cardinality Issuer)
toFinite :: Issuer -> Finite (Cardinality Issuer)
$cstart :: (1 <= Cardinality Issuer) => Issuer
start :: (1 <= Cardinality Issuer) => Issuer
$cend :: (1 <= Cardinality Issuer) => Issuer
end :: (1 <= Cardinality Issuer) => Issuer
$cprevious :: Issuer -> Maybe Issuer
previous :: Issuer -> Maybe Issuer
$cnext :: Issuer -> Maybe Issuer
next :: Issuer -> Maybe Issuer
Finitary

-- | Generates a random 'Issuer'.
--
generate :: MonadRandom m => m Issuer
generate :: forall (m :: * -> *). MonadRandom m => m Issuer
generate = m Issuer
forall (m :: * -> *) a.
(MonadRandom m, Finitary a, 1 <= Cardinality a) =>
m a
randomFinitary

-- | Prints the specified 'Issuer'.
--
toText :: Language -> Issuer -> Text
toText :: Language -> Issuer -> Text
toText = \case
  Language
English -> Issuer -> Text
toTextEnglish
  Language
Chinese -> Issuer -> Text
toTextChinese

toTextChinese :: Issuer -> Text
toTextChinese :: Issuer -> Text
toTextChinese = \case
  Issuer
HouseholdRegistrationOffice ->
    Text
"戶政事務所"
  Issuer
NationalImmigrationAgency ->
    Text
"移民署"

toTextEnglish :: Issuer -> Text
toTextEnglish :: Issuer -> Text
toTextEnglish = \case
  Issuer
HouseholdRegistrationOffice ->
    Text
"Household Registration Office"
  Issuer
NationalImmigrationAgency ->
    Text
"National Immigration Agency"