{-# LANGUAGE OverloadedStrings #-}

-- | This module defines utility functions for the course.
module Study.Courses.English.Vocabulary.Attitudinals.Util where

import Study.Courses.English.Vocabulary.Attitudinals.Model
import Util (chooseItemUniformly)
import Data.Maybe (catMaybes)
import System.Random (StdGen)
import qualified Data.Text as T

-- | Randomly picks one of the available modifiers for a given attitudinal (among "", "cu'i" and "nai").
randomlyPickAttitudinalModifier :: StdGen                       -- ^ A random number generator.
                                -> Attitudinal                  -- ^ An attitudinal.
                                -> (T.Text, T.Text, StdGen)     -- ^ A tuple consisting of
                                                                --
                                                                --     1. the selected attitudinal modifier;
                                                                --     2. the meaning of the corresponding modified attitudinal; and
                                                                --     3. a new random number generator.
randomlyPickAttitudinalModifier :: StdGen -> Attitudinal -> (Text, Text, StdGen)
randomlyPickAttitudinalModifier StdGen
r0 Attitudinal
attitudinal = (Text
attitudinalModifier, Text
meaningOfModifierAttitudinal, StdGen
r1) where
    (Text
meaningOfModifierAttitudinal, StdGen
r1) = StdGen -> Attitudinal -> (Text, StdGen)
randomlyPickAttitudinalMeaning StdGen
r0 Attitudinal
attitudinal
    modifiedAttitudinalExpression :: Text
modifiedAttitudinalExpression = (Attitudinal -> Text
attitudinalWord Attitudinal
attitudinal) Text -> Text -> Text
`T.append` Text
attitudinalModifier
    attitudinalModifier :: Text
attitudinalModifier
        | (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
meaningOfModifierAttitudinal) Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== (Attitudinal -> Maybe Text
attitudinalNeutralMeaning Attitudinal
attitudinal) = Text
"cu'i"
        | (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
meaningOfModifierAttitudinal) Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== (Attitudinal -> Maybe Text
attitudinalNegativeMeaning Attitudinal
attitudinal) =Text
"nai"
        | Bool
otherwise = Text
""

-- | Randomly picks one of the available meanings for a given attitudinal (positive, neutral or negative).
randomlyPickAttitudinalMeaning :: StdGen -> Attitudinal -> (T.Text, StdGen)
randomlyPickAttitudinalMeaning :: StdGen -> Attitudinal -> (Text, StdGen)
randomlyPickAttitudinalMeaning StdGen
r0 Attitudinal
attitudinal = StdGen -> [Text] -> (Text, StdGen)
forall a. StdGen -> [a] -> (a, StdGen)
chooseItemUniformly StdGen
r0 ([Text] -> (Text, StdGen)) -> [Text] -> (Text, StdGen)
forall a b. (a -> b) -> a -> b
$ [Maybe Text] -> [Text]
forall a. [Maybe a] -> [a]
catMaybes [Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Attitudinal -> Text
attitudinalPositiveMeaning Attitudinal
attitudinal, Attitudinal -> Maybe Text
attitudinalNeutralMeaning Attitudinal
attitudinal, Attitudinal -> Maybe Text
attitudinalNegativeMeaning Attitudinal
attitudinal]