{-# LANGUAGE OverloadedStrings #-}

-- | This module defines exercises for each of the course lessons.
module Study.Courses.English.Grammar.Introduction.Exercises where

import Core
import Study.Framework.Lojban.SentenceGenerators (generateNonbridi)
import Study.Framework.Lojban.Extractors (extractSimpleBridiGeneratorFromTranslationGenerator, extractTrivialBridiGeneratorFromVocabulary)
import Study.Framework.Lojban.ExerciseGenerators
import Study.Framework.Lojban.ExerciseUtils (simplifyTerminatorsInCanonicalAnswer)
import Study.Framework.Lojban.TranslationUtils (simplifyTerminatorsInTranslationGenerator, narrowTranslationGenerator)
import Language.Lojban.Core
import Language.Lojban.Dictionaries (englishDictionary)
import Language.Lojban.Presentation (displayStandardSimpleBridi, displayVariantSimpleBridi, displayReorderedStandardSimpleBridi)
import Language.Lojban.Refinement (simplifyTerminatorsInBridiDisplayer)
import Study.Courses.English.Grammar.Introduction.Translations
import Study.Courses.English.Grammar.Introduction.Vocabulary
import Study.Courses.English.Grammar.Introduction.Strategies
import Util (combineGenerators, combineGeneratorsUniformly, generatorFromList, chooseItemUniformly)
import qualified Data.Text as T

-- * Resources
-- | Dictionary for the exercises.
dictionary :: Dictionary
dictionary :: Dictionary
dictionary = Dictionary
englishDictionary

-- * Lesson 1: Basics 1
-- | Exercises for the lesson.
exercises1 :: ExerciseGenerator
exercises1 :: ExerciseGenerator
exercises1 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
25, SimpleBridiGenerator
-> TextGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateEnglishOrLojbanBridiJufraExercise ([(Int, SimpleBridiGenerator)] -> SimpleBridiGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
6, SimpleBridiGenerator
bridiGenerator), (Int
3, SimpleBridiGenerator
trivialBridiGenerator)]) TextGenerator
nonbridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, SimpleBridiGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateSelbriIdentificationExercise SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
10, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlacePositionExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
40, ExerciseGenerator
translationExercises1)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary1_cumulative
        nonbridiGenerator :: TextGenerator
nonbridiGenerator = Vocabulary -> TextGenerator
generateNonbridi Vocabulary
vocabulary
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations1
        trivialBridiGenerator :: SimpleBridiGenerator
trivialBridiGenerator = Vocabulary -> SimpleBridiGenerator
extractTrivialBridiGeneratorFromVocabulary Vocabulary
vocabulary
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = SimpleBridiDisplayer
displayStandardSimpleBridi

-- | Translation exercises for the first lesson.
translationExercises1 :: ExerciseGenerator
translationExercises1 :: ExerciseGenerator
translationExercises1 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations1

-- * Lesson 2: Basics 2
-- | Exercises for the lesson.
exercises2 :: ExerciseGenerator
exercises2 :: ExerciseGenerator
exercises2 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
15, SimpleBridiGenerator
-> TextGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateEnglishOrLojbanBridiJufraExercise ([(Int, SimpleBridiGenerator)] -> SimpleBridiGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
5, SimpleBridiGenerator
bridiGenerator), (Int
3, SimpleBridiGenerator
trivialBridiGenerator)]) TextGenerator
nonbridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, SimpleBridiGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateSelbriIdentificationExercise SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
10, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlacePositionExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
40, ExerciseGenerator
translationExercises2)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary2_cumulative
        nonbridiGenerator :: TextGenerator
nonbridiGenerator = Vocabulary -> TextGenerator
generateNonbridi Vocabulary
vocabulary
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations2
        trivialBridiGenerator :: SimpleBridiGenerator
trivialBridiGenerator = Vocabulary -> SimpleBridiGenerator
extractTrivialBridiGeneratorFromVocabulary Vocabulary
vocabulary
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = [(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
3, SimpleBridiDisplayer
displayVariantSimpleBridi)]

-- | Translation exercises for the second lesson.
translationExercises2 :: ExerciseGenerator
translationExercises2 :: ExerciseGenerator
translationExercises2 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations2

-- * Lesson 3: Basics 3
-- | Exercises for the lesson.
exercises3 :: ExerciseGenerator
exercises3 :: ExerciseGenerator
exercises3 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
10, SimpleBridiGenerator
-> TextGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateEnglishOrLojbanBridiJufraExercise ([(Int, SimpleBridiGenerator)] -> SimpleBridiGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
4, SimpleBridiGenerator
bridiGenerator), (Int
3, SimpleBridiGenerator
trivialBridiGenerator)]) TextGenerator
nonbridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
10, SimpleBridiGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateSelbriIdentificationExercise SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlacePositionExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
30, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
60, ExerciseGenerator
translationExercises3)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary3_cumulative
        nonbridiGenerator :: TextGenerator
nonbridiGenerator = Vocabulary -> TextGenerator
generateNonbridi Vocabulary
vocabulary
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations3
        trivialBridiGenerator :: SimpleBridiGenerator
trivialBridiGenerator = Vocabulary -> SimpleBridiGenerator
extractTrivialBridiGeneratorFromVocabulary Vocabulary
vocabulary
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = [(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
2, SimpleBridiDisplayer
displayVariantSimpleBridi), (Int
1, SimpleBridiDisplayer
displayReorderedStandardSimpleBridi)]

-- | Interesting translation exercises for the third lesson: comprises regular exercises involving interesting translations, as well as "Translate without using zo'e" exercises involving restricted translations.
--
-- Defined separately so that they may be reused in the next checkpoint lesson.
translationExercises3_nice :: ExerciseGenerator
translationExercises3_nice :: ExerciseGenerator
translationExercises3_nice = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
restricted), (Int
5, ExerciseGenerator
nice)] where
    restricted :: ExerciseGenerator
restricted = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateBlacklistedWordTranslationExercise Text
"zo'e" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations3_restricted
    nice :: ExerciseGenerator
nice = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations3_nice

-- | Regular translation exercises for the third lesson.
translationExercises3_normal :: ExerciseGenerator
translationExercises3_normal :: ExerciseGenerator
translationExercises3_normal = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations3_normal

-- | Overall translation exercises for the third lesson.
translationExercises3 :: ExerciseGenerator
translationExercises3 :: ExerciseGenerator
translationExercises3 =  [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
restricted), (Int
5, ExerciseGenerator
unrestricted)] where
    restricted :: ExerciseGenerator
restricted = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateBlacklistedWordTranslationExercise Text
"zo'e" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations3_restricted
    unrestricted :: ExerciseGenerator
unrestricted = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations3

-- * Lesson 4: Tanru
-- | Exercises for the lesson.
exercises4 :: ExerciseGenerator
exercises4 :: ExerciseGenerator
exercises4 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
10, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlacePositionExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
100, ExerciseGenerator
translationExercises4)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary4_cumulative
        -- Narrowing the 'TranslationGenerator' is required to avoid alternative translations using "poi"
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator (TranslationGenerator -> SimpleBridiGenerator)
-> TranslationGenerator -> SimpleBridiGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
narrowTranslationGenerator TranslationGenerator
translations4_sentences
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = [(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
2, SimpleBridiDisplayer
displayVariantSimpleBridi), (Int
1, SimpleBridiDisplayer
displayReorderedStandardSimpleBridi)]

translationExercises4 :: ExerciseGenerator
translationExercises4 :: ExerciseGenerator
translationExercises4 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
translationExercises4_expressions), (Int
1, ExerciseGenerator
translationExercises4_sentences)] where
    translationExercises4_expressions :: ExerciseGenerator
translationExercises4_expressions = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateTranslationExerciseWithCustomTitle Text
"Translate this expression as a tanru" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations4_expressions
    translationExercises4_sentences :: ExerciseGenerator
translationExercises4_sentences = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations4_sentences

-- * Lesson 5: Questions 1
-- | Exercises for the lesson.
exercises5 :: ExerciseGenerator
exercises5 :: ExerciseGenerator
exercises5 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
20, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
20, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
20, ExerciseGenerator
questionExercises5)
        , (Int
80, ExerciseGenerator
translationExercises5)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary5_cumulative
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations5
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = [(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
2, SimpleBridiDisplayer
displayVariantSimpleBridi), (Int
1, SimpleBridiDisplayer
displayReorderedStandardSimpleBridi)]

translationExercises5 :: ExerciseGenerator
translationExercises5 :: ExerciseGenerator
translationExercises5 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
restricted), (Int
5, ExerciseGenerator
unrestricted)] where
    restricted :: ExerciseGenerator
restricted = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateBlacklistedWordTranslationExercise Text
"zo'e" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations5_restricted
    unrestricted :: ExerciseGenerator
unrestricted = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations5

questionExercises5 :: ExerciseGenerator
questionExercises5 :: ExerciseGenerator
questionExercises5 = [Text] -> TranslationGenerator -> ExerciseGenerator
generateFillingBlanksExerciseByAlternatives [Text
"mo", Text
"ma"] (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
narrowTranslationGenerator (TranslationGenerator -> TranslationGenerator)
-> TranslationGenerator -> TranslationGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations5_ma, TranslationGenerator
translations5_mo]

questionExercises5_simplified :: ExerciseGenerator
questionExercises5_simplified :: ExerciseGenerator
questionExercises5_simplified = [Text] -> TranslationGenerator -> ExerciseGenerator
generateFillingBlanksExerciseByAlternatives [Text
"mo", Text
"ma"] (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
simplifyTerminatorsInTranslationGenerator (TranslationGenerator -> TranslationGenerator)
-> TranslationGenerator -> TranslationGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
narrowTranslationGenerator (TranslationGenerator -> TranslationGenerator)
-> TranslationGenerator -> TranslationGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations5_ma, TranslationGenerator
translations5_mo]

-- * Lesson 6: Abstractions 1
-- | Exercises for the lesson.
exercises6 :: ExerciseGenerator
exercises6 :: ExerciseGenerator
exercises6 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
30, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
10, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
40, ExerciseGenerator
abstractionExercises6)
        , (Int
70, ExerciseGenerator
translationExercises6)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary6_cumulative
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations6
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = [(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
2, SimpleBridiDisplayer
displayVariantSimpleBridi), (Int
1, SimpleBridiDisplayer
displayReorderedStandardSimpleBridi)]

translationExercises6 :: ExerciseGenerator
translationExercises6 :: ExerciseGenerator
translationExercises6 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations6

-- Narrowing the 'TranslationGenerator' is required to avoid alternative translations using "ko'a"
abstractionExercises6 :: ExerciseGenerator
abstractionExercises6 :: ExerciseGenerator
abstractionExercises6 = [Text] -> TranslationGenerator -> ExerciseGenerator
generateFillingBlanksExerciseByAlternatives [Text
"lo nu", Text
"lo du'u", Text
"lo se du'u"] (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
narrowTranslationGenerator (TranslationGenerator -> TranslationGenerator)
-> TranslationGenerator -> TranslationGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations6_nu, TranslationGenerator
translations6_du'u, TranslationGenerator
translations6_sedu'u]

-- Narrowing the 'TranslationGenerator' is required to avoid alternative translations using "ko'a"
abstractionExercises6_simplified :: ExerciseGenerator
abstractionExercises6_simplified :: ExerciseGenerator
abstractionExercises6_simplified = [Text] -> TranslationGenerator -> ExerciseGenerator
generateFillingBlanksExerciseByAlternatives [Text
"lo nu", Text
"lo du'u", Text
"lo se du'u"] (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
simplifyTerminatorsInTranslationGenerator (TranslationGenerator -> TranslationGenerator)
-> TranslationGenerator -> TranslationGenerator
forall a b. (a -> b) -> a -> b
$ TranslationGenerator -> TranslationGenerator
narrowTranslationGenerator (TranslationGenerator -> TranslationGenerator)
-> TranslationGenerator -> TranslationGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations6_nu, TranslationGenerator
translations6_du'u, TranslationGenerator
translations6_sedu'u]

-- * Lesson 7: Terminator elision
-- | Exercises for the lesson.
exercises7 :: ExerciseGenerator
exercises7 :: ExerciseGenerator
exercises7 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
20, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
10, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
70, ExerciseGenerator
translationExercises7_restricted)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary6_cumulative
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations7
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = SimpleBridiDisplayer -> SimpleBridiDisplayer
simplifyTerminatorsInBridiDisplayer (SimpleBridiDisplayer -> SimpleBridiDisplayer)
-> SimpleBridiDisplayer -> SimpleBridiDisplayer
forall a b. (a -> b) -> a -> b
$ ([(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
2, SimpleBridiDisplayer
displayVariantSimpleBridi), (Int
1, SimpleBridiDisplayer
displayReorderedStandardSimpleBridi)])

translationExercises7_restricted :: ExerciseGenerator
translationExercises7_restricted :: ExerciseGenerator
translationExercises7_restricted = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateBlacklistedWordTranslationExercise Text
"ku" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations7_restricted

-- * Lesson 8: Checkpoint -- Lessons 1-7
-- | Exercises for the seventh lesson.
exercises1to7 :: ExerciseGenerator
exercises1to7 :: ExerciseGenerator
exercises1to7 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
5, SimpleBridiGenerator
-> TextGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateEnglishOrLojbanBridiJufraExercise ([(Int, SimpleBridiGenerator)] -> SimpleBridiGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
3, SimpleBridiGenerator
bridiGenerator), (Int
3, SimpleBridiGenerator
trivialBridiGenerator)]) TextGenerator
nonbridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
5, SimpleBridiGenerator -> SimpleBridiDisplayer -> ExerciseGenerator
generateSelbriIdentificationExercise SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
5, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlacePositionExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
15, Dictionary
-> SimpleBridiGenerator
-> SimpleBridiDisplayer
-> ExerciseGenerator
generateContextualizedGismuPlaceMeaningExercise Dictionary
dictionary SimpleBridiGenerator
bridiGenerator SimpleBridiDisplayer
bridiDisplayer)
        , (Int
15, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
60, ExerciseGenerator
translationExercises1to7_simplified)
        , (Int
12, ExerciseGenerator
questionExercises5_simplified)
        , (Int
12, ExerciseGenerator
abstractionExercises6_simplified)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary7_cumulative
        bridiGenerator :: SimpleBridiGenerator
bridiGenerator = TranslationGenerator -> SimpleBridiGenerator
extractSimpleBridiGeneratorFromTranslationGenerator TranslationGenerator
translations1to7
        trivialBridiGenerator :: SimpleBridiGenerator
trivialBridiGenerator = Vocabulary -> SimpleBridiGenerator
extractTrivialBridiGeneratorFromVocabulary Vocabulary
vocabulary
        nonbridiGenerator :: TextGenerator
nonbridiGenerator = Vocabulary -> TextGenerator
generateNonbridi Vocabulary
vocabulary
        bridiDisplayer :: SimpleBridiDisplayer
bridiDisplayer = SimpleBridiDisplayer -> SimpleBridiDisplayer
simplifyTerminatorsInBridiDisplayer (SimpleBridiDisplayer -> SimpleBridiDisplayer)
-> SimpleBridiDisplayer -> SimpleBridiDisplayer
forall a b. (a -> b) -> a -> b
$ ([(Int, SimpleBridiDisplayer)] -> SimpleBridiDisplayer
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
7, SimpleBridiDisplayer
displayStandardSimpleBridi), (Int
2, SimpleBridiDisplayer
displayVariantSimpleBridi), (Int
1, SimpleBridiDisplayer
displayReorderedStandardSimpleBridi)])

translationExercises1to7_simplified :: ExerciseGenerator
translationExercises1to7_simplified :: ExerciseGenerator
translationExercises1to7_simplified = Exercise -> Exercise
simplifyTerminatorsInCanonicalAnswer (Exercise -> Exercise) -> ExerciseGenerator -> ExerciseGenerator
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
4, ExerciseGenerator
translationExercises3_nice), (Int
1, ExerciseGenerator
translationExercises3_normal), (Int
5, ExerciseGenerator
translationExercises4), (Int
5, ExerciseGenerator
translationExercises5), (Int
6, ExerciseGenerator
translationExercises6), (Int
5, ExerciseGenerator
translationExercises7_restricted)]

-- * Lesson 9: Relative clauses
-- | Exercises for the lesson.
exercises9 :: ExerciseGenerator
exercises9 :: ExerciseGenerator
exercises9 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        -- TODO: also add contextualized brivla places exercises from the translations themselves
        [ (Int
20, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
70, ExerciseGenerator
translationExercises9)
        , (Int
15, ExerciseGenerator
fillingBlanksExercises9)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary9_cumulative

translationExercises9 :: ExerciseGenerator
translationExercises9 :: ExerciseGenerator
translationExercises9 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations9

fillingBlanksExercises9 :: ExerciseGenerator
fillingBlanksExercises9 :: ExerciseGenerator
fillingBlanksExercises9 = [Text] -> TranslationGenerator -> ExerciseGenerator
generateContextualizedFillingBlanksExerciseByAlternatives [Text
"poi", Text
"noi"] (TranslationGenerator -> TranslationGenerator
narrowTranslationGenerator TranslationGenerator
translations9)

-- * Lesson 10: Linked sumti
-- | Exercises for the lesson.
exercises10 :: ExerciseGenerator
exercises10 :: ExerciseGenerator
exercises10 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        -- TODO: also add contextualized brivla places exercises from the translations themselves
        [ (Int
20, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
70, ExerciseGenerator
translationExercises10)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary10_cumulative

translationExercises10 :: ExerciseGenerator
translationExercises10 :: ExerciseGenerator
translationExercises10 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations10

-- * Lesson 11: Sumtcita
-- | Exercises for the lesson.
exercises11 :: ExerciseGenerator
exercises11 :: ExerciseGenerator
exercises11 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        -- TODO: also add contextualized brivla places exercises from the translations themselves
        [ (Int
20, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
80, ExerciseGenerator
translationExercises11)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary11_cumulative

translationExercises11 :: ExerciseGenerator
translationExercises11 :: ExerciseGenerator
translationExercises11 = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateTranslationExerciseWithCustomTitle Text
"Translate using sumtcita" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations11

-- * Lesson 12: Tenses 1
-- | Exercises for the lesson.
exercises12 :: ExerciseGenerator
exercises12 :: ExerciseGenerator
exercises12 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        -- TODO: also add contextualized brivla places exercises from the translations themselves
        [ (Int
10, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
70, ExerciseGenerator
translationExercises12_restricted)
        , (Int
15, ExerciseGenerator
translationExercises12_unrestricted)
        , (Int
20, ExerciseGenerator
fillingBlanksExercises12)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary12_cumulative

translationExercises12_restricted :: ExerciseGenerator
translationExercises12_restricted :: ExerciseGenerator
translationExercises12_restricted = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateTranslationExerciseWithCustomTitle Text
"Translate <b>specifying temporal tenses</b>" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations12_restricted

translationExercises12_unrestricted :: ExerciseGenerator
translationExercises12_unrestricted :: ExerciseGenerator
translationExercises12_unrestricted = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations12_unrestricted

fillingBlanksExercises12 :: ExerciseGenerator
fillingBlanksExercises12 :: ExerciseGenerator
fillingBlanksExercises12 = [Text] -> TranslationGenerator -> ExerciseGenerator
generateContextualizedFillingBlanksExerciseByAlternatives [Text
"pu", Text
"ca", Text
"ba"] TranslationGenerator
translations12_restricted

-- * Lesson 13: Checkpoint -- Lessons 9-12
-- | Exercises for the lesson.
exercises9to12 :: ExerciseGenerator
exercises9to12 :: ExerciseGenerator
exercises9to12 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        -- TODO: also add contextualized brivla places exercises from the translations themselves
        [ (Int
10, Dictionary -> [Text] -> ExerciseGenerator
generateIsolatedBrivlaPlacesExercise Dictionary
dictionary ([Text] -> ExerciseGenerator) -> [Text] -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ Vocabulary -> [Text]
vocabularyBrivlaList Vocabulary
vocabulary)
        , (Int
70, ExerciseGenerator
translationExercises9to12)
        ]
    where
        vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary12_cumulative

translationExercises9to12 :: ExerciseGenerator
translationExercises9to12 :: ExerciseGenerator
translationExercises9to12 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
    [ (Int
5, ExerciseGenerator
translationExercises9)
    , (Int
2, ExerciseGenerator
fillingBlanksExercises9)
    , (Int
5, ExerciseGenerator
translationExercises10)
    , (Int
5, ExerciseGenerator
translationExercises11)
    , (Int
5, ExerciseGenerator
translationExercises12_restricted)
    , (Int
1, ExerciseGenerator
translationExercises12_unrestricted)
    , (Int
2, ExerciseGenerator
fillingBlanksExercises12)
    ]


-- * Lesson 14: Quotations 1
-- | Exercises for the lesson.
exercises14 :: ExerciseGenerator
exercises14 :: ExerciseGenerator
exercises14 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
70, ExerciseGenerator
translationExercises14)
        ]

translationExercises14 :: ExerciseGenerator
translationExercises14 :: ExerciseGenerator
translationExercises14 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations14_zo, TranslationGenerator
translations14_lu]

-- * Lesson 15: Relative phrases
-- | Exercises for the lesson.
exercises15 :: ExerciseGenerator
exercises15 :: ExerciseGenerator
exercises15 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
70, ExerciseGenerator
translationExercises15)
        ]

translationExercises15 :: ExerciseGenerator
translationExercises15 :: ExerciseGenerator
translationExercises15 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations15_expressions, TranslationGenerator
translations15_sentences]

-- * Lesson 16: Logical connectives 1
-- | Exercises for the lesson.
exercises16 :: ExerciseGenerator
exercises16 :: ExerciseGenerator
exercises16 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
70, ExerciseGenerator
translationExercises16)
        ]

translationExercises16 :: ExerciseGenerator
translationExercises16 :: ExerciseGenerator
translationExercises16 = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateTranslationExerciseWithCustomTitle Text
"Translate using <b>sumti connectives</b>" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer (TranslationGenerator -> ExerciseGenerator)
-> TranslationGenerator -> ExerciseGenerator
forall a b. (a -> b) -> a -> b
$ [TranslationGenerator] -> TranslationGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [TranslationGenerator
translations16_a, TranslationGenerator
translations16_e, TranslationGenerator
translations16_o, TranslationGenerator
translations16_u]

-- * Lesson 17: Negation 1
-- | Exercises for the lesson.
exercises17 :: ExerciseGenerator
exercises17 :: ExerciseGenerator
exercises17 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
70, ExerciseGenerator
translationExercises17)
        , (Int
50, ExerciseGenerator
fillingBlanksExercises17)
        ]

translationExercises17 :: ExerciseGenerator
translationExercises17 :: ExerciseGenerator
translationExercises17 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations17

fillingBlanksExercises17 :: ExerciseGenerator
fillingBlanksExercises17 :: ExerciseGenerator
fillingBlanksExercises17 = [Text] -> TranslationGenerator -> ExerciseGenerator
generateContextualizedFillingBlanksExerciseByAlternatives [Text
"na", Text
"na'e", Text
"no'e", Text
"to'e"] TranslationGenerator
translations17

-- * Lesson 18: Misc 1
-- | Exercises for the lesson.
exercises18 :: ExerciseGenerator
exercises18 :: ExerciseGenerator
exercises18 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
70, ExerciseGenerator
translationExercises18)
        ]

translationExercises18 :: ExerciseGenerator
translationExercises18 :: ExerciseGenerator
translationExercises18 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations18

-- * Lesson 19: Checkpoint -- Lessons 14-18
-- | Exercises for the lesson.
exercises14to18 :: ExerciseGenerator
exercises14to18 :: ExerciseGenerator
exercises14to18 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
10, ExerciseGenerator
exercises14)
        , (Int
10, ExerciseGenerator
exercises15)
        , (Int
10, ExerciseGenerator
exercises16)
        , (Int
10, ExerciseGenerator
exercises17)
        , (Int
10, ExerciseGenerator
exercises18)
        ]

-- * Lesson 20: Morphology
-- | Exercises for the lesson.
exercises20 :: ExerciseGenerator
exercises20 :: ExerciseGenerator
exercises20 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, Vocabulary -> ExerciseGenerator
generateMorphologicalClassExercise Vocabulary
vocabulary), (Int
1, ExerciseGenerator
morphologicalClassDefinitionExercises)] where
    vocabulary :: Vocabulary
vocabulary = Vocabulary
vocabulary20_cumulative
    morphologicalClassDefinitionExercises :: ExerciseGenerator
    morphologicalClassDefinitionExercises :: ExerciseGenerator
morphologicalClassDefinitionExercises StdGen
r0 = Text -> [ExerciseSentence] -> Text -> [Text] -> Bool -> Exercise
SingleChoiceExercise Text
title [ExerciseSentence]
forall {a}. [a]
sentences Text
correctAlternative [Text]
incorrectAlternatives Bool
True where
        morphologicalClassesWithDefinitions :: [(T.Text, T.Text)]
        morphologicalClassesWithDefinitions :: [(Text, Text)]
morphologicalClassesWithDefinitions =
            [ (Text
"brivla", Text
"Bridi word")
            , (Text
"gismu", Text
"Root word")
            , (Text
"lujvo", Text
"Compound word")
            , (Text
"zi'evla", Text
"Free word")
            , (Text
"cmevla", Text
"Name word")
            , (Text
"cmavo", Text
"Grammar word")
            ]
        ((Text
selectedClass, Text
selectedDefinition), StdGen
_) = StdGen -> [(Text, Text)] -> ((Text, Text), StdGen)
forall a. StdGen -> [a] -> (a, StdGen)
chooseItemUniformly StdGen
r0 [(Text, Text)]
morphologicalClassesWithDefinitions
        correctAlternative :: Text
correctAlternative = Text
selectedDefinition
        incorrectAlternatives :: [Text]
incorrectAlternatives = ((Text, Text) -> Text) -> [(Text, Text)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Text) -> Text
forall a b. (a, b) -> b
snd ([(Text, Text)] -> [Text])
-> ([(Text, Text)] -> [(Text, Text)]) -> [(Text, Text)] -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, Text) -> Bool) -> [(Text, Text)] -> [(Text, Text)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((SentenceComparer
forall a. Eq a => a -> a -> Bool
/= Text
selectedClass) (Text -> Bool) -> ((Text, Text) -> Text) -> (Text, Text) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, Text) -> Text
forall a b. (a, b) -> a
fst) ([(Text, Text)] -> [Text]) -> [(Text, Text)] -> [Text]
forall a b. (a -> b) -> a -> b
$ [(Text, Text)]
morphologicalClassesWithDefinitions
        title :: Text
title = Text
"Define <b>" Text -> Text -> Text
`T.append` Text
selectedClass Text -> Text -> Text
`T.append` Text
"</b>"
        sentences :: [a]
sentences = []

-- * Lesson 21: Gadri 1
-- | Exercises for the lesson.
exercises21 :: ExerciseGenerator
exercises21 :: ExerciseGenerator
exercises21 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
gadriProvidingExercise), (Int
3, ExerciseGenerator
gadriChoosingExercise)] where
    gadriProvidingExercise :: ExerciseGenerator
gadriProvidingExercise = Text -> Dictionary -> TextGenerator -> ExerciseGenerator
generateLexiconProvidingExercise Text
"gadri" Dictionary
dictionary TextGenerator
gadriGenerator where
    gadriChoosingExercise :: ExerciseGenerator
gadriChoosingExercise = Text -> Dictionary -> [Text] -> ExerciseGenerator
generateLexiconChoosingExercise Text
"gadri" Dictionary
dictionary [Text]
gadriList
    gadriList :: [Text]
gadriList = [Text
"lo", Text
"le", Text
"la"]
    gadriGenerator :: TextGenerator
gadriGenerator = [Text] -> TextGenerator
forall a. [a] -> StdGen -> (a, StdGen)
generatorFromList [Text]
gadriList

-- * Lesson 22: Numbers 1
-- | Exercises for the lesson.
exercises22 :: ExerciseGenerator
exercises22 :: ExerciseGenerator
exercises22 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
basicNumberExercise), (Int
1, ExerciseGenerator
specialNumberExercise)] where
    basicNumberExercise :: ExerciseGenerator
basicNumberExercise = Integer -> ExerciseGenerator
generateBasicNumberExercise Integer
500
    specialNumberExercise :: ExerciseGenerator
specialNumberExercise = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
specialNumberProvidingExercise), (Int
1, ExerciseGenerator
specialNumberChoosingExercise)] where
        specialNumberProvidingExercise :: ExerciseGenerator
specialNumberProvidingExercise = Text -> Dictionary -> TextGenerator -> ExerciseGenerator
generateLexiconProvidingExercise Text
"number" Dictionary
dictionary TextGenerator
specialNumberGenerator
        specialNumberChoosingExercise :: ExerciseGenerator
specialNumberChoosingExercise = Text -> Dictionary -> [Text] -> ExerciseGenerator
generateLexiconChoosingExercise Text
"number" Dictionary
dictionary [Text]
specialNumberList
        specialNumberList :: [Text]
specialNumberList = [Text
"ro", Text
"so'a", Text
"so'e", Text
"so'i", Text
"so'o", Text
"so'u"]
        specialNumberGenerator :: TextGenerator
specialNumberGenerator = [Text] -> TextGenerator
forall a. [a] -> StdGen -> (a, StdGen)
generatorFromList [Text]
specialNumberList

-- * Lesson 23: Tenses 2
-- | Exercises for the lesson.
exercises23 :: ExerciseGenerator
exercises23 :: ExerciseGenerator
exercises23 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
isolatedEventContourExercises), (Int
3, ExerciseGenerator
translationExercises23)] where
    isolatedEventContourExercises :: ExerciseGenerator
isolatedEventContourExercises = [ExerciseGenerator] -> ExerciseGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [ExerciseGenerator
eventContourProvidingExercises, ExerciseGenerator
eventContourChoosingExercises] where
        eventContourProvidingExercises :: ExerciseGenerator
eventContourProvidingExercises = Text -> Dictionary -> TextGenerator -> ExerciseGenerator
generateLexiconProvidingExercise Text
"event contour" Dictionary
dictionary TextGenerator
eventContourGenerator
        eventContourChoosingExercises :: ExerciseGenerator
eventContourChoosingExercises = Text -> Dictionary -> [Text] -> ExerciseGenerator
generateLexiconChoosingExercise Text
"event contour" Dictionary
dictionary [Text]
eventContourList
        eventContourList :: [Text]
eventContourList = [Text
"pu'o", Text
"ca'o", Text
"ba'o", Text
"co'a", Text
"co'u"]
        eventContourGenerator :: TextGenerator
eventContourGenerator = [Text] -> TextGenerator
forall a. [a] -> StdGen -> (a, StdGen)
generatorFromList [Text]
eventContourList

translationExercises23 :: ExerciseGenerator
translationExercises23 :: ExerciseGenerator
translationExercises23 = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateTranslationExerciseWithCustomTitle Text
"Translate <b>specifying event contours</b>" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations23

-- * Lesson 24: Gadri 2
-- | Exercises for the lesson.
exercises24 :: ExerciseGenerator
exercises24 :: ExerciseGenerator
exercises24 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
gadriProvidingExercise), (Int
1, ExerciseGenerator
gadriChoosingExercise)] where
    gadriProvidingExercise :: ExerciseGenerator
gadriProvidingExercise = Text -> Dictionary -> TextGenerator -> ExerciseGenerator
generateLexiconProvidingExercise Text
"gadri" Dictionary
dictionary TextGenerator
completeGadriGenerator where
    gadriChoosingExercise :: ExerciseGenerator
gadriChoosingExercise = Text -> Dictionary -> [Text] -> ExerciseGenerator
generateLexiconChoosingExercise Text
"gadri" Dictionary
dictionary [Text]
newGadriList
    completeGadriList :: [Text]
completeGadriList = [Text
"lo", Text
"le", Text
"la"] [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ [Text]
newGadriList
    newGadriList :: [Text]
newGadriList = [Text
"loi", Text
"lei", Text
"lai", Text
"lo'e", Text
"le'e"]
    completeGadriGenerator :: TextGenerator
completeGadriGenerator = [Text] -> TextGenerator
forall a. [a] -> StdGen -> (a, StdGen)
generatorFromList [Text]
completeGadriList

-- * Lesson 25: Checkpoint -- Lessons 20-24
-- | Exercises for the lesson.
exercises20to24 :: ExerciseGenerator
exercises20to24 :: ExerciseGenerator
exercises20to24 =
    [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators
        [ (Int
10, ExerciseGenerator
exercises20)
        , (Int
10, ExerciseGenerator
exercises21)
        , (Int
10, ExerciseGenerator
exercises22)
        , (Int
10, ExerciseGenerator
exercises23)
        , (Int
10, ExerciseGenerator
exercises24)
        ]

-- * Lesson 26: Quantifying sumti 1
-- | Exercises for the lesson.
exercises26 :: ExerciseGenerator
exercises26 :: ExerciseGenerator
exercises26 = ExerciseGenerator
translationExercises26

translationExercises26 :: ExerciseGenerator
translationExercises26 :: ExerciseGenerator
translationExercises26 = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations26

-- * Lesson 27: Tenses 3
-- | Exercises for the lesson.
exercises27 :: ExerciseGenerator
exercises27 :: ExerciseGenerator
exercises27 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
3, ExerciseGenerator
translationExercises27), (Int
1, ExerciseGenerator
directionalTenseExercise)] where
    directionalTenseList :: [Text]
directionalTenseList = [Text
"zu'a", Text
"ri'u", Text
"ca'u", Text
"bu'u"]
    directionalTenseGenerator :: TextGenerator
directionalTenseGenerator = [Text] -> TextGenerator
forall a. [a] -> StdGen -> (a, StdGen)
generatorFromList [Text]
directionalTenseList
    directionalTenseProvidingExercise :: ExerciseGenerator
directionalTenseProvidingExercise = Text -> Dictionary -> TextGenerator -> ExerciseGenerator
generateLexiconProvidingExercise Text
"directional tense" Dictionary
dictionary TextGenerator
directionalTenseGenerator where
    directionalTenseChoosingExercise :: ExerciseGenerator
directionalTenseChoosingExercise = Text -> Dictionary -> [Text] -> ExerciseGenerator
generateLexiconChoosingExercise Text
"directional tense" Dictionary
dictionary [Text]
directionalTenseList
    directionalTenseExercise :: ExerciseGenerator
directionalTenseExercise = [ExerciseGenerator] -> ExerciseGenerator
forall a. [StdGen -> a] -> StdGen -> a
combineGeneratorsUniformly [ExerciseGenerator
directionalTenseProvidingExercise, ExerciseGenerator
directionalTenseChoosingExercise]

translationExercises27 :: ExerciseGenerator
translationExercises27 :: ExerciseGenerator
translationExercises27 = [(Int, ExerciseGenerator)] -> ExerciseGenerator
forall a. [(Int, StdGen -> a)] -> StdGen -> a
combineGenerators [(Int
1, ExerciseGenerator
translationExercises27_expressions), (Int
1, ExerciseGenerator
translationExercises27_sentences)] where
    translationExercises27_expressions :: ExerciseGenerator
translationExercises27_expressions = Text
-> SentenceCanonicalizer
-> SentenceComparer
-> TranslationGenerator
-> ExerciseGenerator
generateTranslationExerciseWithCustomTitle Text
"Translate this expression" SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations27_expressions
    translationExercises27_sentences :: ExerciseGenerator
translationExercises27_sentences = SentenceCanonicalizer
-> SentenceComparer -> TranslationGenerator -> ExerciseGenerator
generateTranslationExercise SentenceCanonicalizer
sentenceCanonicalizer SentenceComparer
sentenceComparer TranslationGenerator
translations27_sentences