-- | Common phrasing logic for CdOd tasks
module Modelling.CdOd.Phrasing.Common (
  PhrasingStrings (..),
  phraseChangeWith
) where

import Modelling.Types (
  Change (..),
  )
import Modelling.CdOd.Types (
  AnyRelationship,
  NonInheritancePhrasing (..),
  OmittedDefaultMultiplicities (..),
  PhrasingKind (..),
  toPhrasing,
  )

import Control.OutputCapable.Blocks     (ArticleToUse (..))

-- | Language-specific strings for phrasing
data PhrasingStrings = PhrasingStrings
  { PhrasingStrings -> String
changeNothing :: String
  , PhrasingStrings -> String
addPrefix :: String
  , PhrasingStrings -> String
removePrefix :: String
  , PhrasingStrings -> String
replacePrefix :: String
  , PhrasingStrings -> String
byInfix :: String
  , PhrasingStrings -> String -> String
postProcess :: String -> String  -- ^ Post-processing function for things like trailing commas
  , PhrasingStrings
-> OmittedDefaultMultiplicities
-> ArticleToUse
-> PhrasingKind
-> NonInheritancePhrasing
-> AnyRelationship String String
-> String
phraseRelationWith :: OmittedDefaultMultiplicities
                     -> ArticleToUse
                     -> PhrasingKind
                     -> NonInheritancePhrasing
                     -> AnyRelationship String String
                     -> String
  }



-- | Common change phrasing logic parameterized by language strings
phraseChangeWith
  :: PhrasingStrings
  -> OmittedDefaultMultiplicities
  -> ArticleToUse
  -> Bool
  -> Bool
  -> Change (AnyRelationship String String)
  -> String
phraseChangeWith :: PhrasingStrings
-> OmittedDefaultMultiplicities
-> ArticleToUse
-> Bool
-> Bool
-> Change (AnyRelationship String String)
-> String
phraseChangeWith PhrasingStrings
strings OmittedDefaultMultiplicities
defaultMultiplicities ArticleToUse
article Bool
byName Bool
withDir Change (AnyRelationship String String)
c =
  case (Change (AnyRelationship String String)
-> Maybe (AnyRelationship String String)
forall a. Change a -> Maybe a
add Change (AnyRelationship String String)
c, Change (AnyRelationship String String)
-> Maybe (AnyRelationship String String)
forall a. Change a -> Maybe a
remove Change (AnyRelationship String String)
c) of
  (Maybe (AnyRelationship String String)
Nothing, Maybe (AnyRelationship String String)
Nothing) -> PhrasingStrings -> String
changeNothing PhrasingStrings
strings
  (Just AnyRelationship String String
e,  Maybe (AnyRelationship String String)
Nothing) -> PhrasingStrings -> String
addPrefix PhrasingStrings
strings String -> String -> String
forall a. [a] -> [a] -> [a]
++ PhrasingStrings -> String -> String
postProcess PhrasingStrings
strings (AnyRelationship String String -> String
phrasingNew AnyRelationship String String
e)
  (Maybe (AnyRelationship String String)
Nothing, Just AnyRelationship String String
e ) -> PhrasingStrings -> String
removePrefix PhrasingStrings
strings String -> String -> String
forall a. [a] -> [a] -> [a]
++ AnyRelationship String String -> String
phrasingOld AnyRelationship String String
e
  (Just AnyRelationship String String
e1, Just AnyRelationship String String
e2) ->
    PhrasingStrings -> String
replacePrefix PhrasingStrings
strings String -> String -> String
forall a. [a] -> [a] -> [a]
++ PhrasingStrings -> String -> String
postProcess PhrasingStrings
strings (AnyRelationship String String -> String
phrasingOld AnyRelationship String String
e2)
    String -> String -> String
forall a. [a] -> [a] -> [a]
++ PhrasingStrings -> String
byInfix PhrasingStrings
strings String -> String -> String
forall a. [a] -> [a] -> [a]
++ AnyRelationship String String -> String
phrasingNew AnyRelationship String String
e1
  where
    phrasingOld :: AnyRelationship String String -> String
phrasingOld = PhrasingStrings
-> OmittedDefaultMultiplicities
-> ArticleToUse
-> PhrasingKind
-> NonInheritancePhrasing
-> AnyRelationship String String
-> String
phraseRelationWith PhrasingStrings
strings
      OmittedDefaultMultiplicities
defaultMultiplicities
      ArticleToUse
article
      PhrasingKind
Denoted
      (NonInheritancePhrasing -> AnyRelationship String String -> String)
-> NonInheritancePhrasing
-> AnyRelationship String String
-> String
forall a b. (a -> b) -> a -> b
$ Bool -> Bool -> NonInheritancePhrasing
toPhrasing Bool
byName Bool
withDir
    phrasingNew :: AnyRelationship String String -> String
phrasingNew = PhrasingStrings
-> OmittedDefaultMultiplicities
-> ArticleToUse
-> PhrasingKind
-> NonInheritancePhrasing
-> AnyRelationship String String
-> String
phraseRelationWith PhrasingStrings
strings
      OmittedDefaultMultiplicities
defaultMultiplicities
      ArticleToUse
IndefiniteArticle
      PhrasingKind
Participations
      (NonInheritancePhrasing -> AnyRelationship String String -> String)
-> NonInheritancePhrasing
-> AnyRelationship String String
-> String
forall a b. (a -> b) -> a -> b
$ Bool -> Bool -> NonInheritancePhrasing
toPhrasing Bool
False Bool
withDir