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

module ROC.ID.Nationality
  ( Nationality (..)
  , generate
  )
  where

import Control.Monad.Random.Class
  ( MonadRandom (..) )
import Data.Finitary
  ( Finitary )
import GHC.Generics
  ( Generic )
import ROC.ID.Utilities
  ( randomFinitary )

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

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