{-# LANGUAGE NoImplicitPrelude
           , UnicodeSyntax
           , PackageImports
  #-}

module Text.Numeral.Grammar
    ( -- * Inflection
      Inflection
      -- * Grammatical categories
      -- ** Case
    , NoCase               (noCase,               hasNoCase)
    , Ablative             (ablative,             isAblative)
    , Abessive             (abessive,             isAbessive)
    , Accusative           (accusative,           isAccusative)
    , Comitative           (comitative,           isComitative)
    , Dative               (dative,               isDative)
    , Delative             (delative,             isDelative)
    , Distributive         (distributive,         isDistributive)
    , DistributiveTemporal (distributiveTemporal, isDistributiveTemporal)
    , Essive               (essive,               isEssive)
    , Genitive             (genitive,             isGenitive)
    , Instrumental         (instrumental,         isInstrumental)
    , Instructive          (instructive,          isInstructive)
    , Lative               (lative,               isLative)
    , Locative             (locative,             isLocative)
    , Multiplicative       (multiplicative,       isMultiplicative)
    , Nominative           (nominative,           isNominative)
    , Partitive            (partitive,            isPartitive)
    , SuperEssive          (superEssive,          isSuperEssive)
    , Sublative            (sublative,            isSublative)
    , Translative          (translative,          isTranslative)
    , Vocative             (vocative,             isVocative)
      -- *** Locative cases
    , LocativeInessive (locativeInessive, isLocativeInessive)
    , LocativeElative  (locativeElative,  isLocativeElative)
    , LocativeIllative (locativeIllative, isLocativeIllative)
    , LocativeAdessive (locativeAdessive, isLocativeAdessive)
    , LocativeAblative (locativeAblative, isLocativeAblative)
    , LocativeAllative (locativeAllative, isLocativeAllative)
      -- ** Gender
    , NoGender  (noGender,  hasNoGender)
    , Neuter    (neuter,    isNeuter)
    , Masculine (masculine, isMasculine)
    , Feminine  (feminine,  isFeminine)
    , Common    (common,    isCommon)
      -- ** Number
    , NoNumber (noNumber, hasNoNumber)
    , Singular (singular, isSingular)
    , Dual     (dual,     isDual)
    , Trial    (trial,    isTrial)
    , Paucal   (paucal,   isPaucal)
    , Plural   (plural,   isPlural)
    ) where


--------------------------------------------------------------------------------
-- Imports
--------------------------------------------------------------------------------

import "base" Data.Bool ( Bool )


--------------------------------------------------------------------------------
-- Inflection
--------------------------------------------------------------------------------

-- | Base class for various kinds of inflections.
class Inflection α


--------------------------------------------------------------------------------
-- Case
--------------------------------------------------------------------------------

class Inflection α  NoCase α where
    noCase  α  α
    hasNoCase  α  Bool

-- | The ablative case (abbreviated abl) indicates movement from
-- something, or cause.
class Inflection α  Ablative α where
    ablative  α  α
    isAblative  α  Bool

-- | In linguistics, abessive (abbreviated abe or abess), caritive and privative
-- (abbreviated priv) are names for a grammatical case expressing the lack or
-- absence of the marked noun.
class Inflection α  Abessive α where
    abessive  α  α
    isAbessive  α  Bool

-- | The accusative case (abbreviated acc) indicates the direct object
-- of a verb.
class Inflection α  Accusative α where
    accusative  α  α
    isAccusative  α  Bool

-- | The comitative case (abbreviated com), also known as the associative case
-- (abbreviated ass), is a grammatical case that denotes companionship, and is
-- used where English would typically use preposition "with" in the sense of "in
-- company with" or "together with" (other uses of "with," e.g. with the meaning
-- of "using," "by means of" (I cut bread with a knife) would correspond to the
-- instrumental case or related cases).
class Inflection α  Comitative α where
    comitative  α  α
    isComitative  α  Bool

-- | The dative case (abbreviated dat, or sometimes d when it is a
-- core argument) indicates the indirect object of a verb.
class Inflection α  Dative α where
    dative  α  α
    isDative  α  Bool

-- | The delative case (abbreviated del; from Latin deferre "to bear or bring
-- away or down") in the Hungarian language can originally express the movement
-- from the surface of something (e.g. "off the table"), but it is used in
-- several other meanings (e.g. "about people"), some of them related to the
-- original (e.g. "from the post office").
class Inflection α  Delative α where
    delative  α  α
    isDelative  α  Bool

-- | The distributive case (abbreviated distr) is used on nouns for the meanings
-- of per or each.
class Inflection α  Distributive α where
    distributive  α  α
    isDistributive  α  Bool

-- | The distributive-temporal case specifies when something is done.
class Inflection α  DistributiveTemporal α where
    distributiveTemporal  α  α
    isDistributiveTemporal  α  Bool

-- | The essive or similaris case (abbreviated ess) carries the meaning of a
-- temporary location or state of being, often equivalent to the English "as a
-- (child)".
class Inflection α  Essive α where
    essive  α  α
    isEssive  α  Bool

-- | The genitive case (abbreviated gen; also called the possessive
-- case or second case), which roughly corresponds to English's
-- possessive case and preposition of, indicates the possessor of
-- another noun.
class Inflection α  Genitive α where
    genitive  α  α
    isGenitive  α  Bool

-- | The instrumental case (abbreviated ins or instr; also called the
-- eighth case) indicates an object used in performing an action.
class Inflection α  Instrumental α where
    instrumental  α  α
    isInstrumental  α  Bool

-- | In the Finnish language and Estonian language, the instructive case has the
-- basic meaning of "by means of". It is a comparatively rarely used case,
-- though it is found in some commonly used expressions, such as omin silmin →
-- "with one's own eyes".
class Inflection α  Instructive α where
    instructive  α  α
    isInstructive  α  Bool

-- | Lative (abbreviated lat) is a case which indicates motion to a location. It
-- corresponds to the English prepositions "to" and "into". The lative case
-- belongs to the group of the general local cases together with the locative
-- and separative case. The term derives from the Latin lat-, the participle
-- stem of ferre, "to bring".
class Inflection α  Lative α where
    lative  α  α
    isLative  α  Bool

-- | The locative case (abbreviated loc) indicates a location.
class Inflection α  Locative α where
    locative  α  α
    isLocative  α  Bool

-- | The multiplicative case is a grammatical case used for marking a number of
-- something ("three times").
class Inflection α  Multiplicative α where
    multiplicative  α  α
    isMultiplicative  α  Bool

-- | The nominative case (abbreviated nom) indicates the subject of a
-- finite verb.
class Inflection α  Nominative α where
    nominative  α  α
    isNominative  α  Bool

-- | The partitive case (abbreviated ptv or more ambiguously part)
-- denotes "partialness", "without result", or "without specific
-- identity". It is also used in contexts where a subgroup is selected
-- from a larger group, or with numbers.
class Inflection α  Partitive α where
    partitive  α  α
    isPartitive  α  Bool

-- | The Superessive case (abbreviated supe) is a grammatical declension
-- indicating location on top of, or on the surface of something. Its name comes
-- from Latin supersum, superesse: to be over and above.
class Inflection α  SuperEssive α where
    superEssive  α  α
    isSuperEssive  α  Bool

-- | The term sublative case (abbreviated subl) is used to refer to grammatical
-- cases expressing different situations: In Hungarian, it expresses the
-- destination of the movement, originally to the surface of something (e.g. sit
-- down on the ground, climb the tree), but in other figurative meanings as well
-- (e.g. to university, for two nights), while in Tsez and other Northeast
-- Caucasian languages it denotes a movement towards the bottomsides or the area
-- under an object. The sublative case is used in the Finnish, Tsez and
-- Hungarian languages.
class Inflection α  Sublative α where
    sublative  α  α
    isSublative  α  Bool

-- | The translative case (abbreviated transl) is a grammatical case that
-- indicates a change in state of a noun, with the general sense of "becoming X"
-- or "change to X".
class Inflection α  Translative α where
    translative  α  α
    isTranslative  α  Bool

-- | The vocative case indicates an addressee.
class Inflection α  Vocative α where
    vocative  α  α
    isVocative  α  Bool


--------------------------------------------------------------------------------
-- Locative cases
--------------------------------------------------------------------------------

-- | Inessive case (abbreviated ine; from Latin inesse "to be in or at") is a
-- locative grammatical case. This case carries the basic meaning of "in".
class Locative α  LocativeInessive α where
    locativeInessive  α  α
    isLocativeInessive  α  Bool

-- | Elative (abbreviated ela; from Latin efferre "to bring or carry out") is a
-- locative case with the basic meaning "out of".
class Locative α  LocativeElative α where
    locativeElative  α  α
    isLocativeElative  α  Bool

-- | Illative (abbreviated ill; from Latin illatus "brought in") is, in the
-- Finnish language, Estonian language and the Hungarian language, the third of
-- the locative cases with the basic meaning of "into (the inside of)".
class Locative α  LocativeIllative α where
    locativeIllative  α  α
    isLocativeIllative  α  Bool

-- | In Uralic languages, such as Finnish, Estonian and Hungarian, the adessive
-- case (abbreviated ade; from Latin adesse "to be present") is the fourth of
-- the locative cases with the basic meaning of "on".
class Locative α  LocativeAdessive α where
    locativeAdessive  α  α
    isLocativeAdessive  α  Bool

-- | In linguistics, ablative case (abbreviated abl) is a name given to cases in
-- various languages whose common characteristic is that they mark motion away
-- from something, though the details in each language may differ. The name
-- "ablative" derives from the Latin ablatus, the (irregular) perfect passive
-- participle of auferre "to carry away".
class Locative α  LocativeAblative α where
    locativeAblative  α  α
    isLocativeAblative  α  Bool

-- | Allative case (abbreviated all; from Latin allāt-, afferre "to bring to")
-- is a type of the locative cases used in several languages. The term allative
-- is generally used for the lative case in the majority of languages which do
-- not make finer distinctions.
class Locative α  LocativeAllative α where
    locativeAllative  α  α
    isLocativeAllative  α  Bool


--------------------------------------------------------------------------------
-- Gender
--------------------------------------------------------------------------------

class Inflection α  NoGender α where
    noGender  α  α
    hasNoGender  α  Bool

class Inflection α  Neuter α where
    neuter  α  α
    isNeuter  α  Bool

class Inflection α  Masculine α where
    masculine  α  α
    isMasculine  α  Bool

class Inflection α  Feminine α where
    feminine  α  α
    isFeminine  α  Bool

class Inflection α  Common α where
    common  α  α
    isCommon  α  Bool


--------------------------------------------------------------------------------
-- Number
--------------------------------------------------------------------------------

class Inflection α  NoNumber α where
    noNumber  α  α
    hasNoNumber  α  Bool

class Inflection α  Singular α where
    singular  α  α
    isSingular  α  Bool

class Inflection α  Dual α where
    dual  α  α
    isDual  α  Bool

class Inflection α  Trial α where
    trial  α  α
    isTrial  α  Bool

class Inflection α  Paucal α where
    paucal  α  α
    isPaucal  α  Bool

class Inflection α  Plural α where
    plural  α  α
    isPlural  α  Bool