packages feed

roc-id-0.3.0.0: components/roc-id/ROC/ID/Gender.hs

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

module ROC.ID.Gender
  ( Gender (..)
  , toText
  , generate
  ) where

import Control.Monad.Random.Class
  ( MonadRandom (..) )
import Data.Text
  ( Text )
import GHC.Generics
  ( Generic )
import ROC.ID.Language
  ( Language (..) )
import ROC.ID.Utilities
  ( randomBoundedEnum )

-- | A person's gender, encodable within an ROC identification number.
--
data Gender = Male | Female
  deriving (Bounded, Enum, Eq, Generic, Ord, Read, Show)

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

toTextEnglish :: Gender -> Text
toTextEnglish = \case
  Male   -> "Male"
  Female -> "Female"

toTextChinese :: Gender -> Text
toTextChinese = \case
  Male   -> "男性"
  Female -> "女性"

-- | Generates a random 'Gender'.
--
generate :: MonadRandom m => m Gender
generate = randomBoundedEnum