{-# LANGUAGE ScopedTypeVariables #-}

-- |
-- Module      : Language.IPA.Parser
-- Copyright   : (c) 2021 Rory Tyler Hayford
--
-- License     : BSD-3-Clause
-- Maintainer  : rory.hayford@protonmail.com
-- Stability   : experimental
-- Portability : GHC
--
-- Parser for IPA literals
module Language.IPA.Parser
    ( -- * IPA parsing
      -- ** Parsing single segments
      parseSegment
    , segmentP
      -- ** Parsing syllables
    , parseSyllable
    , syllableP
    , parseSyllables
    , syllablesP
      -- * X-SAMPA parsing
      -- ** Parsing single segments
    , parseSegmentXSampa
    , segmentXSampaP
      -- ** Parsing syllables
    , parseSyllableXSampa
    , parseSyllablesXSampa
    , syllableXSampaP
    ) where

import           Control.Applicative  ( Alternative((<|>), some, many) )

import           Data.Attoparsec.Text ( IResult(Fail, Done, Partial), Parser )
import qualified Data.Attoparsec.Text as P
import           Data.Foldable        ( asum, foldl' )
import           Data.Functor         ( ($>), (<&>) )
import           Data.Text            ( Text )
import           Data.Text.Normalize  ( NormalizationMode(NFD), normalize )

import           Language.IPA.Types

-- | Parse a single literal segment in IPA notation, returning 'InvalidIPA' upon
-- failure and a 'Segment' upon success. Note that supplying two or more segment
-- literals will cause the parse to fail
--
-- >>> parseSegment "ɨːː"
-- Right (WithSegmentalFeature (Length OverLong) (Vowel Close Central Unrounded))
--
-- >>> parseSegment "ɨːːb"
-- Left (InvalidIPA "Failed to parse character 'b'")
parseSegment :: Text -> Either IPAException Segment
parseSegment :: Text -> Either IPAException Segment
parseSegment t :: Text
t =
    (Text -> IPAException)
-> Text -> IResult Text Segment -> Either IPAException Segment
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
InvalidIPA
                 Text
msg
                 (Parser Segment -> Text -> IResult Text Segment
forall a. Parser a -> Text -> Result a
P.parse (Parser Segment
segmentP Parser Segment -> Parser Text () -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
P.endOfInput) (NormalizationMode -> Text -> Text
normalize NormalizationMode
NFD Text
t))
  where
    msg :: Text
msg = "Failed to parse character(s):"

-- | Parse a literal syllable in IPA notation, returning 'InvalidIPA' upon
-- failure and a 'Syllable' upon success, where the syllable is parameterized by
-- some type @t@ satisfying a 'MultiSegment' constraint. Note that, as with
-- 'parseSegment', supplying two or more syllable literals will cause the parse
-- to fail
--
-- >>> parseSyllable @[] "ma˧˥"
-- Right (WithSuprasegmentalFeature (LexicalToneContour HighRising)
--       (Syllable [Consonant (Pulmonic Voiced Bilabial Nasal),Vowel Open Front Unrounded]))
parseSyllable :: MultiSegment t => Text -> Either IPAException (Syllable t)
parseSyllable :: Text -> Either IPAException (Syllable t)
parseSyllable t :: Text
t =
    (Text -> IPAException)
-> Text
-> IResult Text (Syllable t)
-> Either IPAException (Syllable t)
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
InvalidIPA
                 Text
msg
                 (Parser (Syllable t) -> Text -> IResult Text (Syllable t)
forall a. Parser a -> Text -> Result a
P.parse (Parser (Syllable t)
forall (t :: * -> *). MultiSegment t => Parser (Syllable t)
syllableP Parser (Syllable t) -> Parser Text () -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
P.endOfInput) (NormalizationMode -> Text -> Text
normalize NormalizationMode
NFD Text
t))
  where
    msg :: Text
msg = "Failed to parse segment(s):"

-- | Parse several syllables into a container parameterized by the same type as that
-- parameterizing the individual 'Syllable's. Whitespace between syllables is interpreted
-- as a syllable boundary
--
-- >>> parseSyllables @[] "haːj˧ ɓaː˧"
-- Right [ WithSuprasegmentalFeature (LevelLexicalTone MidTone)
--           (Syllable [ Consonant (Pulmonic Voiceless Glottal (Fricative NonSibilant))
--                     , WithSegmentalFeature (Length Long) (Vowel Open Front Unrounded)
--                     , Consonant (Pulmonic Voiced Palatal Approximant)
--                     ])
--       , WithSuprasegmentalFeature (LevelLexicalTone MidTone)
--           (Syllable [ Consonant (Implosive Voiced Bilabial)
--                     , WithSegmentalFeature (Length Long) (Vowel Open Front Unrounded)
--                     ])
--       ]
parseSyllables :: (MultiSegment t, Monoid (t (Syllable t)))
               => Text
               -> Either IPAException (t (Syllable t))
parseSyllables :: Text -> Either IPAException (t (Syllable t))
parseSyllables t :: Text
t =
    (Text -> IPAException)
-> Text
-> IResult Text (t (Syllable t))
-> Either IPAException (t (Syllable t))
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
InvalidIPA
                 Text
msg
                 (Parser (t (Syllable t)) -> Text -> IResult Text (t (Syllable t))
forall a. Parser a -> Text -> Result a
P.parse (Parser (t (Syllable t))
forall (t :: * -> *).
(MultiSegment t, Monoid (t (Syllable t))) =>
Parser (t (Syllable t))
syllablesP Parser (t (Syllable t))
-> Parser Text () -> Parser (t (Syllable t))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
P.endOfInput) (NormalizationMode -> Text -> Text
normalize NormalizationMode
NFD Text
t))
  where
    msg :: Text
msg = "Failed to parse syllable:"

-- | Parser for syllables. This function is exposed to allow users to create
-- more specific parsers for aggregations of multiple syllables
syllableP :: MultiSegment t => Parser (Syllable t)
syllableP :: Parser (Syllable t)
syllableP = Parser (Syllable t)
withStressP Parser (Syllable t) -> Parser (Syllable t) -> Parser (Syllable t)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Syllable t)
withFeaturesP Parser (Syllable t) -> Parser (Syllable t) -> Parser (Syllable t)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> t Segment -> Syllable t
forall (t :: * -> *). t Segment -> Syllable t
Syllable (t Segment -> Syllable t)
-> Parser Text (t Segment) -> Parser (Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text (t Segment)
justSegments
  where
    justSegments :: Parser Text (t Segment)
justSegments = Parser Segment -> Parser Text (t Segment)
forall (t :: * -> *) a (f :: * -> *).
(Applicative t, Monoid (t a), Alternative f) =>
f a -> f (t a)
someT Parser Segment
segmentP

    withFeaturesP :: Parser (Syllable t)
withFeaturesP = (SuprasegmentalFeature -> Syllable t -> Syllable t)
-> Syllable t -> [SuprasegmentalFeature] -> Syllable t
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SuprasegmentalFeature -> Syllable t -> Syllable t
forall (t :: * -> *).
SuprasegmentalFeature -> Syllable t -> Syllable t
WithSuprasegmentalFeature
        (Syllable t -> [SuprasegmentalFeature] -> Syllable t)
-> Parser (Syllable t)
-> Parser Text ([SuprasegmentalFeature] -> Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (t Segment -> Syllable t
forall (t :: * -> *). t Segment -> Syllable t
Syllable (t Segment -> Syllable t)
-> Parser Text (t Segment) -> Parser (Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text (t Segment)
justSegments)
        Parser Text ([SuprasegmentalFeature] -> Syllable t)
-> Parser Text [SuprasegmentalFeature] -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SuprasegmentalFeature
-> Parser Text [SuprasegmentalFeature]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some Parser Text SuprasegmentalFeature
suprasegmentalFeatureP

    withStressP :: Parser (Syllable t)
withStressP = (SuprasegmentalFeature -> Syllable t -> Syllable t)
-> Syllable t -> [SuprasegmentalFeature] -> Syllable t
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SuprasegmentalFeature -> Syllable t -> Syllable t
forall (t :: * -> *).
SuprasegmentalFeature -> Syllable t -> Syllable t
WithSuprasegmentalFeature (Syllable t -> [SuprasegmentalFeature] -> Syllable t)
-> Parser (Syllable t)
-> Parser Text ([SuprasegmentalFeature] -> Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Syllable t)
withStress
        Parser Text ([SuprasegmentalFeature] -> Syllable t)
-> Parser Text [SuprasegmentalFeature] -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SuprasegmentalFeature
-> Parser Text [SuprasegmentalFeature]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Text SuprasegmentalFeature
suprasegmentalFeatureP
      where
        withStress :: Parser (Syllable t)
withStress = SuprasegmentalFeature -> Syllable t -> Syllable t
forall (t :: * -> *).
SuprasegmentalFeature -> Syllable t -> Syllable t
WithSuprasegmentalFeature (SuprasegmentalFeature -> Syllable t -> Syllable t)
-> Parser Text SuprasegmentalFeature
-> Parser Text (Syllable t -> Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text SuprasegmentalFeature
stressP
            Parser Text (Syllable t -> Syllable t)
-> Parser (Syllable t) -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (t Segment -> Syllable t
forall (t :: * -> *). t Segment -> Syllable t
Syllable (t Segment -> Syllable t)
-> Parser Text (t Segment) -> Parser (Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text (t Segment)
justSegments)

-- | Parser for segments. This function is exposed to allow users to create
-- more specific parsers for multi-segment sequences
segmentP :: Parser Segment
segmentP :: Parser Segment
segmentP = Parser Segment
withFeatureP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
pureSegmentP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
optionalP
  where
    pureSegmentP :: Parser Segment
pureSegmentP = Parser Segment
vowelP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Consonant -> Segment
Consonant (Consonant -> Segment) -> Parser Text Consonant -> Parser Segment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Consonant
consonantP

    withFeatureP :: Parser Segment
withFeatureP =
        (SegmentalFeature -> Segment -> Segment)
-> Segment -> [SegmentalFeature] -> Segment
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SegmentalFeature -> Segment -> Segment
WithSegmentalFeature (Segment -> [SegmentalFeature] -> Segment)
-> Parser Segment -> Parser Text ([SegmentalFeature] -> Segment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Segment
pureSegmentP Parser Text ([SegmentalFeature] -> Segment)
-> Parser Text [SegmentalFeature] -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SegmentalFeature -> Parser Text [SegmentalFeature]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some Parser Text SegmentalFeature
segmentalFeatureP

    optionalP :: Parser Segment
optionalP    = Segment -> Segment
Optional
        (Segment -> Segment) -> Parser Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ("(" Parser Text Text -> Parser Segment -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Parser Segment
withFeatureP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
pureSegmentP) Parser Segment -> Parser Text Text -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ")")

-- | Parser for poly-syllabic sequences, with individual syllables separated
-- by (optional) whitespace
syllablesP :: (MultiSegment t, Monoid (t (Syllable t)))
           => Parser (t (Syllable t))
syllablesP :: Parser (t (Syllable t))
syllablesP = Parser Text (Syllable t) -> Parser (t (Syllable t))
forall (t :: * -> *) a (f :: * -> *).
(Applicative t, Monoid (t a), Alternative f) =>
f a -> f (t a)
someT Parser Text (Syllable t)
withWS
  where
    withWS :: Parser Text (Syllable t)
withWS = Parser Text (Syllable t)
forall (t :: * -> *). MultiSegment t => Parser (Syllable t)
syllableP Parser Text (Syllable t)
-> Parser Text [Char] -> Parser Text (Syllable t)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char -> Parser Text [Char]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Text Char
P.space

consonantP :: Parser Consonant
consonantP :: Parser Text Consonant
consonantP =
    Parser Text Consonant
clickP Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
implosiveP Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
ejectiveP Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
doublyArticulatedP Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
pulmonicP

vowelP :: Parser Segment
vowelP :: Parser Segment
vowelP = Parser Segment
triphthongP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
diphthongP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Vowel -> Segment
Vowel (Vowel -> Segment) -> Parser Text Vowel -> Parser Segment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Vowel
pureP
  where
    diphthongP :: Parser Segment
diphthongP  = Vowel -> Vowel -> Segment
Diphthong (Vowel -> Vowel -> Segment)
-> Parser Text Vowel -> Parser Text (Vowel -> Segment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Vowel
pureP Parser Text (Vowel -> Segment)
-> Parser Text Vowel -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Vowel
pureP

    triphthongP :: Parser Segment
triphthongP = Vowel -> Vowel -> Vowel -> Segment
Triphthong (Vowel -> Vowel -> Vowel -> Segment)
-> Parser Text Vowel -> Parser Text (Vowel -> Vowel -> Segment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Vowel
pureP Parser Text (Vowel -> Vowel -> Segment)
-> Parser Text Vowel -> Parser Text (Vowel -> Segment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Vowel
pureP Parser Text (Vowel -> Segment)
-> Parser Text Vowel -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Vowel
pureP

    pv :: Height -> Backness -> Roundedness -> Vowel
pv          = Height -> Backness -> Roundedness -> Vowel
Pure

    lowered :: Parser Text Char
lowered     = Char -> Parser Text Char
diacriticP '\x031e'

    pureP :: Parser Text Vowel
pureP       =
        [Parser Text Vowel] -> Parser Text Vowel
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "e" Parser Text Text -> Parser Text Char -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Front Roundedness
Unrounded
             , "ø" Parser Text Text -> Parser Text Char -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Front Roundedness
Rounded
             , "ɤ" Parser Text Text -> Parser Text Char -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Back Roundedness
Unrounded
             , "o" Parser Text Text -> Parser Text Char -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Back Roundedness
Rounded
             , "i" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Front Roundedness
Unrounded
             , "y" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Front Roundedness
Rounded
             , "ɨ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Central Roundedness
Unrounded
             , "ʉ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Central Roundedness
Rounded
             , "ɯ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Back Roundedness
Unrounded
             , "u" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Back Roundedness
Rounded
             , "ɪ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearClose Backness
Front Roundedness
Unrounded
             , "ʏ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearClose Backness
Front Roundedness
Rounded
             , "ʊ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearClose Backness
Back Roundedness
Rounded
             , "e" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Front Roundedness
Unrounded
             , "ø" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Front Roundedness
Rounded
             , "ɘ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Central Roundedness
Unrounded
             , "ɵ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Central Roundedness
Rounded
             , "ɤ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Back Roundedness
Unrounded
             , "o" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Back Roundedness
Rounded
             , "ə" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Central Roundedness
Unrounded
             , "ɛ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Front Roundedness
Unrounded
             , "œ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Front Roundedness
Rounded
             , "ɜ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Central Roundedness
Unrounded
             , "ɞ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Central Roundedness
Rounded
             , "ʌ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Back Roundedness
Unrounded
             , "ɔ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Back Roundedness
Rounded
             , "æ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearOpen Backness
Front Roundedness
Unrounded
             , "ɐ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearOpen Backness
Central Roundedness
Unrounded
             , "a" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Front Roundedness
Unrounded
             , "ɶ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Front Roundedness
Rounded
             , "ä" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Central Roundedness
Unrounded
             , "ɑ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Back Roundedness
Unrounded
             , "ɒ" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Back Roundedness
Rounded
             ]

pulmonicP :: Parser Consonant
pulmonicP :: Parser Text Consonant
pulmonicP =
    [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ Parser Text Consonant
biliabialP
         , Parser Text Consonant
labioDentalP
         , Parser Text Consonant
dentalP
         , Parser Text Consonant
postAlveolarP
         , Parser Text Consonant
retroflexP
         , Parser Text Consonant
palatalP
         , Parser Text Consonant
velarP
         , Parser Text Consonant
uvularP
         , Parser Text Consonant
pharyngealP
         , Parser Text Consonant
glottalP
           -- Alveolars should go at the end; alveolar plosives appear in
           -- several affricates in other places of articulation
         , Parser Text Consonant
alveolarP
         ]
  where
    biliabialP :: Parser Text Consonant
biliabialP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        bc :: Phonation -> Manner -> Consonant
bc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Bilabial

        cs :: [Parser Text Consonant]
cs   =
            [ "m" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulated "p" "ɸ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "b" "β"
              Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , "β" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ɸ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ʙ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced Manner
Trill
            , "b" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced Manner
Plosive
            , "p" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiceless Manner
Plosive
            ]

    labioDentalP :: Parser Text Consonant
labioDentalP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        ldc :: Phonation -> Manner -> Consonant
ldc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
LabioDental

        cs :: [Parser Text Consonant]
cs    = [ "ɱ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced Manner
Nasal
                , "f" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
                , "v" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
                , "ʋ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced Manner
Approximant
                , "ⱱ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced Manner
Flap
                ]

    dentalP :: Parser Text Consonant
dentalP = "θ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
dc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "ð" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
dc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
      where
        dc :: Phonation -> Manner -> Consonant
dc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Dental

    alveolarP :: Parser Text Consonant
alveolarP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        ac :: Phonation -> Manner -> Consonant
ac v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Alveolar

        cs :: [Parser Text Consonant]
cs   =
            [ "n" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulated "t" "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "d" "z" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "z" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "ɹ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Approximant
            , "ɾ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Flap
            , "r" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Trill
            , "ɬ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless Manner
LateralFricative
            , "ɮ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
LateralFricative
            , "l" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
LateralApproximant
            , "ɺ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
LateralFlap
            , "tɬ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless Manner
LateralAffricate
            , "dɮ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
LateralAffricate
            , "t" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless Manner
Plosive
            , "d" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Plosive
            ]

    postAlveolarP :: Parser Text Consonant
postAlveolarP = Text -> Text -> Parser Text Text
doubleArticulated "t" "ʃ"
        Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Text -> Parser Text Text
doubleArticulated "d" "ʒ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "ʃ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "ʒ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
      where
        pc :: Phonation -> Manner -> Consonant
pc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
PostAlveolar

    retroflexP :: Parser Text Consonant
retroflexP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        rc :: Phonation -> Manner -> Consonant
rc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Retroflex

        cs :: [Parser Text Consonant]
cs   =
            [ "ɳ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulated "ʈ" "ʂ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "ɖ" "ʐ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , "ʂ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "ʐ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "ɻ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Approximant
            , "ɽ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Flap
            , "ɽr" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Trill
            , "ɭ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
LateralApproximant
            , "ʈ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiceless Manner
Plosive
            , "ɖ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Plosive
            ]

    palatalP :: Parser Text Consonant
palatalP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        pc :: Phonation -> Manner -> Consonant
pc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Palatal

        cs :: [Parser Text Consonant]
cs   =
            [ "ɲ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulated "t" "ɕ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "d" "ʑ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "c" "ç"
              Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "ɟ" "ʝ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , "ɕ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "ʑ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "ç" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ʝ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "j" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Approximant
            , "ʎ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
LateralApproximant
            , "c" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless Manner
Plosive
            , "ɟ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Plosive
            ]

    velarP :: Parser Text Consonant
velarP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        vc :: Phonation -> Manner -> Consonant
vc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Velar

        cs :: [Parser Text Consonant]
cs   =
            [ "ŋ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulated "k" "x"
              Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "g" "ɣ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , "x" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ɣ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ɰ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
Approximant
            , "ʟ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
LateralApproximant
            , "k" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiceless Manner
Plosive
            , "g" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
Plosive
            ]

    uvularP :: Parser Text Consonant
uvularP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        uc :: Phonation -> Manner -> Consonant
uc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Uvular

        cs :: [Parser Text Consonant]
cs   =
            [ "ɴ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulated "q" "χ"
              Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , Text -> Text -> Parser Text Text
doubleArticulated "ɢ" "ʁ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "χ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ʁ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ʀ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced Manner
Trill
            , "q" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiceless Manner
Plosive
            , "ɢ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced Manner
Plosive
            ]

    pharyngealP :: Parser Text Consonant
pharyngealP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        pc :: Phonation -> Manner -> Consonant
pc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Pharyngeal

        cs :: [Parser Text Consonant]
cs   =
            [ Text -> Text -> Parser Text Text
doubleArticulated "ʡ" "ʢ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
            , "ħ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ʕ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
            , "ʡ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Flap
            , "ʜ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Trill
            , "ʢ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless Manner
Trill
            , "ʡ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless Manner
Plosive
            ]

    glottalP :: Parser Text Consonant
glottalP = Text -> Text -> Parser Text Text
doubleArticulated "ʔ" "h"
        Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "ʔ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiceless Manner
Plosive
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "h" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "ɦ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
      where
        gc :: Phonation -> Manner -> Consonant
gc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Glottal

ejectiveP :: Parser Consonant
ejectiveP :: Parser Text Consonant
ejectiveP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs Parser Text Consonant -> Parser Text Char -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
ejective
  where
    ejective :: Parser Text Char
ejective = Char -> Parser Text Char
diacriticP '\x02bc'

    ej :: Place -> Manner -> Consonant
ej       = Place -> Manner -> Consonant
Ejective

    cs :: [Parser Text Consonant]
cs       =
        [ Text -> Text -> Parser Text Text
doubleArticulated "t" "ɬ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar Manner
LateralAffricate
        , Text -> Text -> Parser Text Text
doubleArticulated "q" "χ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Uvular (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
        , Text -> Text -> Parser Text Text
doubleArticulated "t" "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulated "t" "ʃ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
PostAlveolar (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulated "ʈ" "ʂ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Retroflex (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulated "t" "ɕ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Palatal (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulated "k" "x" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Velar (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
        , "p" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Bilabial Manner
Plosive
        , "ɸ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Bilabial (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "f" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
LabioDental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "θ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Dental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "ɬ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar Manner
LateralFricative
        , "t" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar Manner
Plosive
        , "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "ʃ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
PostAlveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "ʈ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Retroflex Manner
Plosive
        , "ʂ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Retroflex (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "c" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Palatal Manner
Plosive
        , "ɕ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Palatal (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "k" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Velar Manner
Plosive
        , "x" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Velar (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "q" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Uvular Manner
Plosive
        , "χ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Uvular (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "ʡ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Pharyngeal Manner
Plosive
        ]

implosiveP :: Parser Consonant
implosiveP :: Parser Text Consonant
implosiveP = Phonation -> Place -> Consonant
Implosive Phonation
Voiceless (Place -> Consonant) -> Parser Text Place -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text Place] -> Parser Text Place
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Place]
cs Parser Text Consonant -> Parser Text Char -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
voiceless
    Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Phonation -> Place -> Consonant
Implosive Phonation
Voiced (Place -> Consonant) -> Parser Text Place -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text Place] -> Parser Text Place
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Place]
cs
  where
    voiceless :: Parser Text Char
voiceless = Char -> Parser Text Char
diacriticP '\x030a'

    cs :: [Parser Text Place]
cs        = [ "ɓ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Bilabial
                , "ɗ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Alveolar
                , "ᶑ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Retroflex
                , "ʄ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Palatal
                , "ɠ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Velar
                , "ʛ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Uvular
                ]

clickP :: Parser Consonant
clickP :: Parser Text Consonant
clickP = Place -> Consonant
Click
    (Place -> Consonant) -> Parser Text Place -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text Place] -> Parser Text Place
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "ʘ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Bilabial
             , "ǀ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Dental
             , "ǃ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Alveolar
             , "ǁ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
PostAlveolar
             , "ǂ" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Palatal
             ]

doublyArticulatedP :: Parser Consonant
doublyArticulatedP :: Parser Text Consonant
doublyArticulatedP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
  where
    da :: Phonation -> Place -> Place -> Manner -> Consonant
da = Phonation -> Place -> Place -> Manner -> Consonant
DoublyArticulated

    cs :: [Parser Text Consonant]
cs =
        [ Text -> Text -> Parser Text Text
doubleArticulated "n" "m" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Alveolar Manner
Nasal
        , Text -> Text -> Parser Text Text
doubleArticulated "t" "p" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Alveolar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulated "d" "b" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Alveolar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulated "ŋ" "m" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Velar Manner
Nasal
        , Text -> Text -> Parser Text Text
doubleArticulated "k" "p" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Velar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulated "g" "b" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Velar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulated "q" "ʡ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Uvular Place
Pharyngeal Manner
Plosive
        , "ɥ" Parser Text Text -> Parser Text Char -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Text Char
P.char '\x030a'
          Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Palatal (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "ɥ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Palatal Manner
Approximant
        , "ʍ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Velar (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "w" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Velar Manner
Approximant
        , "ɫ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Alveolar Place
Velar Manner
LateralApproximant
        , "ɧ" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
PostAlveolar Place
Velar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        ]

segmentalFeatureP :: Parser SegmentalFeature
segmentalFeatureP :: Parser Text SegmentalFeature
segmentalFeatureP = Parser Text SegmentalFeature
secondaryArticulationP Parser Text SegmentalFeature
-> Parser Text SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [Parser Text SegmentalFeature] -> Parser Text SegmentalFeature
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text SegmentalFeature]
fs
  where
    fs :: [Parser Text SegmentalFeature]
fs = [ "\x030a" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> SegmentalFeature
Voicing Phonation
Voiceless
         , "\x030c" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> SegmentalFeature
Voicing Phonation
Voiced
         , "\x2d0\x2d0" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
OverLong
         , "\x2d1" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
HalfLong
         , "\x2d0" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
Long
         , "\x0306" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
ExtraShort
         , "\x036a" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Aspirated
         , "\x0339" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
MoreRounded
         , "\x031c" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
LessRounded
         , "\x031f" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Advanced
         , "\x0320" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Retracted
         , "\x0308" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Centralized
         , "\x033d" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
MidCentralized
         , "\x1d5d" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Compressed
         , "\x0329" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Syllabic
         , "\x032f" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
NonSyllabic
         , "\x02de" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Rhotacized
         , "\x0324" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
BreathyVoice
         , "\x0330" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
CreakyVoice
         , "\x033c" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
LinguoLabialized
         , "\x02b7" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Labialized
         , "\x02b2" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Palatalized
         , "\x02e0" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Velarized
         , "\x02e4" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Pharyngealized
         , "\x031d" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Raised
         , "\x031e" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Lowered
         , "\x0318" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
AdvancedTongueRoot
         , "\x0319" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
RetractedTongueRoot
         , "\x032a" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Dentalized
         , "\x033a" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Apical
         , "\x033b" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Laminal
         , "\x0303" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Nasalized
         , "\x207f" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
NasalRelease
         , "\x02e1" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
LateralRelease
         , "\x031a" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
NoAudibleRelease
         ]

secondaryArticulationP :: Parser SegmentalFeature
secondaryArticulationP :: Parser Text SegmentalFeature
secondaryArticulationP = Segment -> SegmentalFeature
SecondaryArticulation (Segment -> SegmentalFeature)
-> Parser Segment -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Segment
secondaryP
  where
    secondaryP :: Parser Segment
secondaryP = [Parser Segment] -> Parser Segment
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Segment]
segments

    pc :: Phonation -> Place -> Manner -> Segment
pc         = Phonation -> Place -> Manner -> Segment
PulmonicConsonant

    pv :: Height -> Backness -> Roundedness -> Segment
pv         = Height -> Backness -> Roundedness -> Segment
PureVowel

    segments :: [Parser Segment]
segments   =
        [ "\x1d50" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Bilabial Manner
Nasal
        , "\x1dac" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
LabioDental Manner
Nasal
        , "\x207f" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Alveolar Manner
Nasal
        , "\x1daf" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Retroflex Manner
Nasal
        , "\x1dae" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Palatal Manner
Nasal
        , "\x1d51" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Velar Manner
Nasal
        , "\x1db0" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Uvular Manner
Nasal
        , "\x1d56" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Bilabial Manner
Plosive
        , "\x1d47" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Bilabial Manner
Plosive
        , "\x1d57" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Alveolar Manner
Plosive
        , "\x1d48" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Alveolar Manner
Plosive
        , "\x1d9c" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Palatal Manner
Plosive
        , "\x1da1" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Palatal Manner
Plosive
        , "\x1d4f" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Velar Manner
Plosive
        , "\x1da2" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Velar Manner
Plosive
        , "\x02c0" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Glottal Manner
Plosive
        , "\x1db2" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Bilabial (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1d5d" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Bilabial (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1da0" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
LabioDental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1d5b" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
LabioDental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1dbf" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Dental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1d9e" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Dental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x02e2" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Alveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "\x1dbb" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Alveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "\x1db4" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
PostAlveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "\x1dbe" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
PostAlveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "\x1d9d" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Palatal (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "\x1dbd" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Palatal (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "\x1d9c\x0327" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Palatal (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1da8" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Palatal (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x02e3" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Velar (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x02e0" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Velar (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1d61" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Uvular (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x02b6" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Uvular (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x02b0" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Glottal (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x02b1" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Glottal (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "\x1db9" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
LabioDental Manner
Approximant
        , "\x02b4" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Alveolar Manner
Approximant
        , "\x02b5" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Retroflex Manner
Approximant
        , "\x02b2" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Palatal Manner
Approximant
        , "\xab69" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiceless Place
Velar Manner
Approximant
        , "\x1dad" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Velar Manner
Approximant
        , "\x02b3" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Manner -> Segment
pc Phonation
Voiced Place
Alveolar Manner
Trill
        , "\x1df1"
          Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Segment
DoublyArticulatedConsonant Phonation
Voiced Place
Bilabial Place
Velar Manner
Approximant
        , "\x2071" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Close Backness
Front Roundedness
Unrounded
        , "\x02b8" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Close Backness
Front Roundedness
Rounded
        , "\x1da4" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Close Backness
Central Roundedness
Unrounded
        , "\x1db6" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Close Backness
Central Roundedness
Rounded
        , "\x1d5a" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Close Backness
Back Roundedness
Unrounded
        , "\x1d58" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Close Backness
Back Roundedness
Rounded
        , "\x1da6" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearClose Backness
Front Roundedness
Unrounded
        , "\x1da7" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearClose Backness
Central Roundedness
Unrounded
        , "\x1db7" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearClose Backness
Back Roundedness
Rounded
        , "\x1d4a" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Mid Backness
Central Roundedness
Unrounded
        , "\x1d4a" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Mid Backness
Central Roundedness
Rounded
        , "\x1d4b" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
OpenMid Backness
Front Roundedness
Unrounded
        , "\xa7f9" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
OpenMid Backness
Front Roundedness
Rounded
        , "\x1d9f" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
OpenMid Backness
Central Roundedness
Unrounded
        , "\x1dba" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
OpenMid Backness
Back Roundedness
Unrounded
        , "\x1d53" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
OpenMid Backness
Back Roundedness
Rounded
        , "\x1d46" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearOpen Backness
Front Roundedness
Unrounded
        , "\x1d44" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearOpen Backness
Central Roundedness
Unrounded
        , "\x1d45" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearOpen Backness
Back Roundedness
Unrounded
        , "\x1d9b" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
NearOpen Backness
Back Roundedness
Rounded
        , "\x1d43" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Open Backness
Front Roundedness
Unrounded
        , "\x1d44" Parser Text Text -> Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Segment
pv Height
Open Backness
Back Roundedness
Rounded
        ]

diacriticP :: Char -> Parser Char
diacriticP :: Char -> Parser Text Char
diacriticP = Char -> Parser Text Char
P.char

doubleArticulated :: Text -> Text -> Parser Text
doubleArticulated :: Text -> Text -> Parser Text Text
doubleArticulated x :: Text
x y :: Text
y = Text -> Parser Text Text
P.string (Text -> Parser Text Text) -> Text -> Parser Text Text
forall a b. (a -> b) -> a -> b
$ Text
x Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
invertedBreve Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
y
  where
    invertedBreve :: Text
invertedBreve = "\x0361"

suprasegmentalFeatureP :: Parser SuprasegmentalFeature
suprasegmentalFeatureP :: Parser Text SuprasegmentalFeature
suprasegmentalFeatureP = [Parser Text SuprasegmentalFeature]
-> Parser Text SuprasegmentalFeature
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text SuprasegmentalFeature]
fs
  where
    fs :: [Parser Text SuprasegmentalFeature]
fs = [ Parser Text SuprasegmentalFeature
toneContourP
         , Parser Text SuprasegmentalFeature
toneContourDiacriticP
         , Parser Text SuprasegmentalFeature
levelToneP
         , Parser Text SuprasegmentalFeature
levelToneDiacriticP
         , [Parser Int] -> Parser Text SuprasegmentalFeature
forall (t :: * -> *).
Foldable t =>
t (Parser Int) -> Parser Text SuprasegmentalFeature
toneNumberP [Parser Int]
digits
         , "." Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SuprasegmentalFeature
Break
         , "\x203f" Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SuprasegmentalFeature
Linking
         ]

    levelToneP :: Parser Text SuprasegmentalFeature
levelToneP = LevelTone -> SuprasegmentalFeature
LevelLexicalTone
        (LevelTone -> SuprasegmentalFeature)
-> Parser Text LevelTone -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text LevelTone] -> Parser Text LevelTone
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "\x02e5" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
ExtraHighTone
                 , "\x02e6" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
HighTone
                 , "\x02e7" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
MidTone
                 , "\x02e8" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
LowTone
                 , "\x02e9" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
ExtraLowTone
                 ]

    levelToneDiacriticP :: Parser Text SuprasegmentalFeature
levelToneDiacriticP = LevelTone -> SuprasegmentalFeature
LevelLexicalToneDiacritic
        (LevelTone -> SuprasegmentalFeature)
-> Parser Text LevelTone -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text LevelTone] -> Parser Text LevelTone
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "\x030b" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
ExtraHighTone
                 , "\x0341" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
HighTone
                 , "\x0304" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
MidTone
                 , "\x0340" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
LowTone
                 , "\x030f" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
ExtraLowTone
                 , "\xa71c" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
DownStep
                 , "\xa71b" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
UpStep
                 ]

    toneContourP :: Parser Text SuprasegmentalFeature
toneContourP = ToneContour -> SuprasegmentalFeature
LexicalToneContour
        (ToneContour -> SuprasegmentalFeature)
-> Parser Text ToneContour -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text ToneContour] -> Parser Text ToneContour
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "\x02e9\x02e5" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
Rising
                 , "\x02e5\x02e9" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
Falling
                 , "\x02e7\x02e5" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
HighRising
                 , "\x02e9\x02e7" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
LowRising
                 , "\x02e5\x02e7" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
HighFalling
                 , "\x02e7\x02e9" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
LowFalling
                 , "\x02e7\x02e6\x02e8" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
RisingFalling
                 , "\x02e7\x02e8\x02e6" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
FallingRising
                 , "\x2197" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
GlobalRise
                 , "\x2199" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
GlobalFall
                 ]

    toneContourDiacriticP :: Parser Text SuprasegmentalFeature
toneContourDiacriticP = ToneContour -> SuprasegmentalFeature
LexicalToneContourDiacritic
        (ToneContour -> SuprasegmentalFeature)
-> Parser Text ToneContour -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text ToneContour] -> Parser Text ToneContour
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "\x0302" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
Rising
                 , "\x030c" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
Falling
                 , "\x1dc9" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
HighRising
                 , "\x1dc5" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
LowRising
                 , "\x1dc7" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
HighFalling
                 , "\x1dc6" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
LowFalling
                 , "\x1dc8" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
RisingFalling
                 , "\x1dc9" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
FallingRising
                 ]

    digits :: [Parser Int]
digits = [ "\x2070" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 0
             , "\x00b9" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 1
             , "\x00b2" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 2
             , "\x00b3" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 3
             , "\x2074" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 4
             , "\x2075" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 5
             , "\x2076" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 6
             , "\x2077" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 7
             , "\x2078" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 8
             , "\x2079" Parser Text Text -> Int -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> 9
             ]

stressP :: Parser SuprasegmentalFeature
stressP :: Parser Text SuprasegmentalFeature
stressP = "\x02c8" Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Stress -> SuprasegmentalFeature
Stress Stress
Primary Parser Text SuprasegmentalFeature
-> Parser Text SuprasegmentalFeature
-> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "\x02cc" Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Stress -> SuprasegmentalFeature
Stress Stress
Secondary

toneNumberP :: (Foldable t) => t (Parser Int) -> Parser SuprasegmentalFeature
toneNumberP :: t (Parser Int) -> Parser Text SuprasegmentalFeature
toneNumberP digits :: t (Parser Int)
digits = Int -> SuprasegmentalFeature
ToneNumber
    (Int -> SuprasegmentalFeature)
-> Parser Int -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Int -> Parser Text [Int]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some (t (Parser Int) -> Parser Int
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum t (Parser Int)
digits) Parser Text [Int] -> ([Int] -> Int) -> Parser Int
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (Int -> Int -> Int) -> Int -> [Int] -> Int
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\a :: Int
a b :: Int
b -> Int
b Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
a Int -> Int -> Int
forall a. Num a => a -> a -> a
* 10) 0)

consT :: (Applicative t, Monoid (t a)) => a -> t a -> t a
consT :: a -> t a -> t a
consT x :: a
x xs :: t a
xs = a -> t a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x t a -> t a -> t a
forall a. Semigroup a => a -> a -> a
<> t a
xs

manyT :: (Applicative t, Monoid (t a), Alternative f) => f a -> f (t a)
manyT :: f a -> f (t a)
manyT v :: f a
v = f (t a)
manyT'
  where
    manyT' :: f (t a)
manyT' = f (t a)
someT' f (t a) -> f (t a) -> f (t a)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> t a -> f (t a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure t a
forall a. Monoid a => a
mempty

    someT' :: f (t a)
someT' = a -> t a -> t a
forall (t :: * -> *) a.
(Applicative t, Monoid (t a)) =>
a -> t a -> t a
consT (a -> t a -> t a) -> f a -> f (t a -> t a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f a
v f (t a -> t a) -> f (t a) -> f (t a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f (t a)
manyT'

someT :: (Applicative t, Monoid (t a), Alternative f) => f a -> f (t a)
someT :: f a -> f (t a)
someT v :: f a
v = a -> t a -> t a
forall (t :: * -> *) a.
(Applicative t, Monoid (t a)) =>
a -> t a -> t a
consT (a -> t a -> t a) -> f a -> f (t a -> t a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f a
v f (t a -> t a) -> f (t a) -> f (t a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f a -> f (t a)
forall (t :: * -> *) a (f :: * -> *).
(Applicative t, Monoid (t a), Alternative f) =>
f a -> f (t a)
manyT f a
v

handleResult :: (Text -> IPAException)
             -> Text
             -> IResult Text b
             -> Either IPAException b
handleResult :: (Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult ty :: Text -> IPAException
ty t :: Text
t i :: IResult Text b
i = case IResult Text b
i of
    Done _ r :: b
r    -> b -> Either IPAException b
forall a b. b -> Either a b
Right b
r
    Fail ch :: Text
ch _ _ -> IPAException -> Either IPAException b
forall a b. a -> Either a b
Left (IPAException -> Either IPAException b)
-> (Text -> IPAException) -> Text -> Either IPAException b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> IPAException
ty (Text -> Either IPAException b) -> Text -> Either IPAException b
forall a b. (a -> b) -> a -> b
$ [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat [ Text
t, " ", "'", Text
ch, "'" ]
    Partial p :: Text -> IResult Text b
p   -> (Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
ty Text
t (Text -> IResult Text b
p Text
forall a. Monoid a => a
mempty)

-------------------------------------------------------------------------------
--                               X-SAMPA Parser                              --
-------------------------------------------------------------------------------
-- | As 'parseSegment', but in X-SAMPA notation
parseSegmentXSampa :: Text -> Either IPAException Segment
parseSegmentXSampa :: Text -> Either IPAException Segment
parseSegmentXSampa t :: Text
t =
    (Text -> IPAException)
-> Text -> IResult Text Segment -> Either IPAException Segment
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
InvalidXSampa
                 Text
msg
                 (Parser Segment -> Text -> IResult Text Segment
forall a. Parser a -> Text -> Result a
P.parse (Parser Segment
segmentXSampaP Parser Segment -> Parser Text () -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
P.endOfInput) Text
t)
  where
    msg :: Text
msg = "Failed to parse character(s):"

-- | As 'parseSyllable', but in X-SAMPA notation
parseSyllableXSampa
    :: MultiSegment t => Text -> Either IPAException (Syllable t)
parseSyllableXSampa :: Text -> Either IPAException (Syllable t)
parseSyllableXSampa t :: Text
t =
    (Text -> IPAException)
-> Text
-> IResult Text (Syllable t)
-> Either IPAException (Syllable t)
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
InvalidXSampa
                 Text
msg
                 (Parser (Syllable t) -> Text -> IResult Text (Syllable t)
forall a. Parser a -> Text -> Result a
P.parse (Parser (Syllable t)
forall (t :: * -> *). MultiSegment t => Parser (Syllable t)
syllableXSampaP Parser (Syllable t) -> Parser Text () -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
P.endOfInput) Text
t)
  where
    msg :: Text
msg = "Failed to parse segment(s):"

-- | As 'parseSyllables', but in X-SAMPA notation
parseSyllablesXSampa :: (MultiSegment t, Monoid (t (Syllable t)))
                     => Text
                     -> Either IPAException (t (Syllable t))
parseSyllablesXSampa :: Text -> Either IPAException (t (Syllable t))
parseSyllablesXSampa t :: Text
t =
    (Text -> IPAException)
-> Text
-> IResult Text (t (Syllable t))
-> Either IPAException (t (Syllable t))
forall b.
(Text -> IPAException)
-> Text -> IResult Text b -> Either IPAException b
handleResult Text -> IPAException
InvalidXSampa
                 Text
msg
                 (Parser (t (Syllable t)) -> Text -> IResult Text (t (Syllable t))
forall a. Parser a -> Text -> Result a
P.parse (Parser (t (Syllable t))
forall (t :: * -> *).
(MultiSegment t, Monoid (t (Syllable t))) =>
Parser (t (Syllable t))
syllablesXSampaP Parser (t (Syllable t))
-> Parser Text () -> Parser (t (Syllable t))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
P.endOfInput) Text
t)
  where
    msg :: Text
msg = "Failed to parse syllable:"

-- | As 'segmentP', but in X-SAMPA notation
segmentXSampaP :: Parser Segment
segmentXSampaP :: Parser Segment
segmentXSampaP = Parser Segment
withFeatureP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
pureSegmentP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
optionalP
  where
    pureSegmentP :: Parser Segment
pureSegmentP = Parser Segment
vowelXSampaP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Consonant -> Segment
Consonant (Consonant -> Segment) -> Parser Text Consonant -> Parser Segment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Consonant
consonantXSampaP

    withFeatureP :: Parser Segment
withFeatureP = (SegmentalFeature -> Segment -> Segment)
-> Segment -> [SegmentalFeature] -> Segment
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SegmentalFeature -> Segment -> Segment
WithSegmentalFeature (Segment -> [SegmentalFeature] -> Segment)
-> Parser Segment -> Parser Text ([SegmentalFeature] -> Segment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Segment
pureSegmentP
        Parser Text ([SegmentalFeature] -> Segment)
-> Parser Text [SegmentalFeature] -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SegmentalFeature -> Parser Text [SegmentalFeature]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some Parser Text SegmentalFeature
segmentalFeatureXSampaP

    optionalP :: Parser Segment
optionalP    = Segment -> Segment
Optional
        (Segment -> Segment) -> Parser Segment -> Parser Segment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ("(" Parser Text Text -> Parser Segment -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Parser Segment
withFeatureP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
pureSegmentP) Parser Segment -> Parser Text Text -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ")")

-- | As 'syllableP', but in X-SAMPA notation
syllableXSampaP :: MultiSegment t => Parser (Syllable t)
syllableXSampaP :: Parser (Syllable t)
syllableXSampaP = Parser (Syllable t)
withStressP Parser (Syllable t) -> Parser (Syllable t) -> Parser (Syllable t)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Syllable t)
withFeaturesP Parser (Syllable t) -> Parser (Syllable t) -> Parser (Syllable t)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> t Segment -> Syllable t
forall (t :: * -> *). t Segment -> Syllable t
Syllable (t Segment -> Syllable t)
-> Parser Text (t Segment) -> Parser (Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text (t Segment)
justSegments
  where
    justSegments :: Parser Text (t Segment)
justSegments = Parser Segment -> Parser Text (t Segment)
forall (t :: * -> *) a (f :: * -> *).
(Applicative t, Monoid (t a), Alternative f) =>
f a -> f (t a)
someT Parser Segment
segmentXSampaP

    withFeaturesP :: Parser (Syllable t)
withFeaturesP = (SuprasegmentalFeature -> Syllable t -> Syllable t)
-> Syllable t -> [SuprasegmentalFeature] -> Syllable t
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SuprasegmentalFeature -> Syllable t -> Syllable t
forall (t :: * -> *).
SuprasegmentalFeature -> Syllable t -> Syllable t
WithSuprasegmentalFeature
        (Syllable t -> [SuprasegmentalFeature] -> Syllable t)
-> Parser (Syllable t)
-> Parser Text ([SuprasegmentalFeature] -> Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (t Segment -> Syllable t
forall (t :: * -> *). t Segment -> Syllable t
Syllable (t Segment -> Syllable t)
-> Parser Text (t Segment) -> Parser (Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text (t Segment)
justSegments)
        Parser Text ([SuprasegmentalFeature] -> Syllable t)
-> Parser Text [SuprasegmentalFeature] -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SuprasegmentalFeature
-> Parser Text [SuprasegmentalFeature]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some Parser Text SuprasegmentalFeature
suprasegmentalFeatureXSampaP

    withStressP :: Parser (Syllable t)
withStressP = (SuprasegmentalFeature -> Syllable t -> Syllable t)
-> Syllable t -> [SuprasegmentalFeature] -> Syllable t
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SuprasegmentalFeature -> Syllable t -> Syllable t
forall (t :: * -> *).
SuprasegmentalFeature -> Syllable t -> Syllable t
WithSuprasegmentalFeature (Syllable t -> [SuprasegmentalFeature] -> Syllable t)
-> Parser (Syllable t)
-> Parser Text ([SuprasegmentalFeature] -> Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Syllable t)
withStress
        Parser Text ([SuprasegmentalFeature] -> Syllable t)
-> Parser Text [SuprasegmentalFeature] -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SuprasegmentalFeature
-> Parser Text [SuprasegmentalFeature]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Text SuprasegmentalFeature
suprasegmentalFeatureXSampaP
      where
        withStress :: Parser (Syllable t)
withStress = SuprasegmentalFeature -> Syllable t -> Syllable t
forall (t :: * -> *).
SuprasegmentalFeature -> Syllable t -> Syllable t
WithSuprasegmentalFeature (SuprasegmentalFeature -> Syllable t -> Syllable t)
-> Parser Text SuprasegmentalFeature
-> Parser Text (Syllable t -> Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text SuprasegmentalFeature
stressXSampaP
            Parser Text (Syllable t -> Syllable t)
-> Parser (Syllable t) -> Parser (Syllable t)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (t Segment -> Syllable t
forall (t :: * -> *). t Segment -> Syllable t
Syllable (t Segment -> Syllable t)
-> Parser Text (t Segment) -> Parser (Syllable t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text (t Segment)
justSegments)

syllablesXSampaP :: (MultiSegment t, Monoid (t (Syllable t)))
                 => Parser (t (Syllable t))
syllablesXSampaP :: Parser (t (Syllable t))
syllablesXSampaP = Parser Text (Syllable t) -> Parser (t (Syllable t))
forall (t :: * -> *) a (f :: * -> *).
(Applicative t, Monoid (t a), Alternative f) =>
f a -> f (t a)
someT Parser Text (Syllable t)
withWS
  where
    withWS :: Parser Text (Syllable t)
withWS = Parser Text (Syllable t)
forall (t :: * -> *). MultiSegment t => Parser (Syllable t)
syllableXSampaP Parser Text (Syllable t)
-> Parser Text [Char] -> Parser Text (Syllable t)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char -> Parser Text [Char]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Text Char
P.space

consonantXSampaP :: Parser Consonant
consonantXSampaP :: Parser Text Consonant
consonantXSampaP = Parser Text Consonant
clickXSampaP
    Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
implosiveXSampaP
    Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
ejectiveXSampaP
    Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
doublyArticulatedXSampaP
    Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Consonant
pulmonicXSampaP

vowelXSampaP :: Parser Segment
vowelXSampaP :: Parser Segment
vowelXSampaP = Parser Segment
triphthongP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Segment
diphthongP Parser Segment -> Parser Segment -> Parser Segment
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Vowel -> Segment
Vowel (Vowel -> Segment) -> Parser Text Vowel -> Parser Segment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Vowel
pureP
  where
    diphthongP :: Parser Segment
diphthongP  = Vowel -> Vowel -> Segment
Diphthong (Vowel -> Vowel -> Segment)
-> Parser Text Vowel -> Parser Text (Vowel -> Segment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Vowel
pureP Parser Text (Vowel -> Segment)
-> Parser Text Vowel -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Vowel
pureP

    triphthongP :: Parser Segment
triphthongP = Vowel -> Vowel -> Vowel -> Segment
Triphthong (Vowel -> Vowel -> Vowel -> Segment)
-> Parser Text Vowel -> Parser Text (Vowel -> Vowel -> Segment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Vowel
pureP Parser Text (Vowel -> Vowel -> Segment)
-> Parser Text Vowel -> Parser Text (Vowel -> Segment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Vowel
pureP Parser Text (Vowel -> Segment)
-> Parser Text Vowel -> Parser Segment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Vowel
pureP

    pv :: Height -> Backness -> Roundedness -> Vowel
pv          = Height -> Backness -> Roundedness -> Vowel
Pure

    lowered :: Parser Text Text
lowered     = "_o"

    pureP :: Parser Text Vowel
pureP       =
        [Parser Text Vowel] -> Parser Text Vowel
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "e" Parser Text Text -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Front Roundedness
Unrounded
             , "2" Parser Text Text -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Front Roundedness
Rounded
             , "7" Parser Text Text -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Back Roundedness
Unrounded
             , "o" Parser Text Text -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
lowered Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Back Roundedness
Rounded
             , "i" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Front Roundedness
Unrounded
             , "y" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Front Roundedness
Rounded
             , "1" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Central Roundedness
Unrounded
             , "}" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Central Roundedness
Rounded
             , "M" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Back Roundedness
Unrounded
             , "u" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Close Backness
Back Roundedness
Rounded
             , "I" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearClose Backness
Front Roundedness
Unrounded
             , "Y" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearClose Backness
Front Roundedness
Rounded
             , "U" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearClose Backness
Back Roundedness
Rounded
             , "e" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Front Roundedness
Unrounded
             , "2" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Front Roundedness
Rounded
             , "@" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Central Roundedness
Unrounded
             , "8" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Central Roundedness
Rounded
             , "7" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Back Roundedness
Unrounded
             , "o" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
CloseMid Backness
Back Roundedness
Rounded
             , "@" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Mid Backness
Central Roundedness
Unrounded
             , "E" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Front Roundedness
Unrounded
             , "9" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Front Roundedness
Rounded
             , "3" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Central Roundedness
Unrounded
             , "3" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Central Roundedness
Rounded
             , "V" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Back Roundedness
Unrounded
             , "O" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
OpenMid Backness
Back Roundedness
Rounded
             , "{" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearOpen Backness
Front Roundedness
Unrounded
             , "6" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
NearOpen Backness
Central Roundedness
Unrounded
             , "a" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Front Roundedness
Unrounded
             , "&" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Front Roundedness
Rounded
             , "A" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Back Roundedness
Unrounded
             , "Q" Parser Text Text -> Vowel -> Parser Text Vowel
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Height -> Backness -> Roundedness -> Vowel
pv Height
Open Backness
Back Roundedness
Rounded
             ]

pulmonicXSampaP :: Parser Consonant
pulmonicXSampaP :: Parser Text Consonant
pulmonicXSampaP =
    [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ Parser Text Consonant
biliabialP
         , Parser Text Consonant
labioDentalP
         , Parser Text Consonant
dentalP
         , Parser Text Consonant
postAlveolarP
         , Parser Text Consonant
retroflexP
         , Parser Text Consonant
palatalP
         , Parser Text Consonant
velarP
         , Parser Text Consonant
uvularP
         , Parser Text Consonant
pharyngealP
         , Parser Text Consonant
glottalP
         , Parser Text Consonant
alveolarP
         ]
  where
    biliabialP :: Parser Text Consonant
biliabialP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        bc :: Phonation -> Manner -> Consonant
bc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Bilabial

        cs :: [Parser Text Consonant]
cs   = [ "m" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced Manner
Nasal
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "p" "p" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash
                 Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "b" "B"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
               , "B" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "p" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "B" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced Manner
Trill
               , "b" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiced Manner
Plosive
               , "p" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
bc Phonation
Voiceless Manner
Plosive
               ]

    labioDentalP :: Parser Text Consonant
labioDentalP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        ldc :: Phonation -> Manner -> Consonant
ldc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
LabioDental

        cs :: [Parser Text Consonant]
cs    = [ "F" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced Manner
Nasal
                , "f" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
                , "v" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
                , "P" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ldc Phonation
Voiced Manner
Approximant
                ]

    dentalP :: Parser Text Consonant
dentalP = "T" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
dc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "D" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
dc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
      where
        dc :: Phonation -> Manner -> Consonant
dc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Dental

    alveolarP :: Parser Text Consonant
alveolarP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        ac :: Phonation -> Manner -> Consonant
ac v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Alveolar

        cs :: [Parser Text Consonant]
cs   = [ "n" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Nasal
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "s"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "d" "z"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
               , "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
               , "z" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
               , "r" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Approximant
               , "4" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Flap
               , "r" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Trill
               , "K" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless Manner
LateralFricative
               , "K" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
LateralFricative
               , "l" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
LateralApproximant
               , "t" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiceless Manner
Plosive
               , "d" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
ac Phonation
Voiced Manner
Plosive
               ]

    postAlveolarP :: Parser Text Consonant
postAlveolarP = Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "S"
        Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Text -> Parser Text Text
doubleArticulatedXSampa "d" "Z" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "S" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "Z" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
      where
        pc :: Phonation -> Manner -> Consonant
pc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
PostAlveolar

    retroflexP :: Parser Text Consonant
retroflexP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        rc :: Phonation -> Manner -> Consonant
rc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Retroflex

        retroflexDiacritic :: Parser Text Char
retroflexDiacritic = Char -> Parser Text Char
diacriticP '`'

        cs :: [Parser Text Consonant]
cs                 =
            [ "n" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Nasal
            , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t`" "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic
              Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "d`" "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic
              Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
            , "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "z" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
            , "r" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Approximant
            , "r" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Flap
            , "l" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
LateralApproximant
            , "t" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiceless Manner
Plosive
            , "d" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
retroflexDiacritic Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
rc Phonation
Voiced Manner
Plosive
            ]

    palatalP :: Parser Text Consonant
palatalP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        pc :: Phonation -> Manner -> Consonant
pc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Palatal

        cs :: [Parser Text Consonant]
cs   = [ "J" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Nasal
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash
                 Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
Sibilant)
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "d" "z" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash
                 Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
Sibilant)
               , "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
Sibilant)
               , "z" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
Sibilant)
               , "C" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "j" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "j" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Approximant
               , "L" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
LateralApproximant
               , "c" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless Manner
Plosive
               , "J" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced Manner
Plosive
               ]

    velarP :: Parser Text Consonant
velarP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        vc :: Phonation -> Manner -> Consonant
vc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Velar

        cs :: [Parser Text Consonant]
cs   = [ "N" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
Nasal
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "k" "x"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "g" "G"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
               , "x" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "G" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "m" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
Approximant
               , "L" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
LateralApproximant
               , "k" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiceless Manner
Plosive
               , "g" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
vc Phonation
Voiced Manner
Plosive
               ]

    uvularP :: Parser Text Consonant
uvularP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
      where
        uc :: Phonation -> Manner -> Consonant
uc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Uvular

        cs :: [Parser Text Consonant]
cs   = [ "N" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced Manner
Nasal
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "q" "X"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "G\\" "R"
                 Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "X" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "R" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
               , "R" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced Manner
Trill
               , "q" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiceless Manner
Plosive
               , "G" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
uc Phonation
Voiced Manner
Plosive
               ]

    pharyngealP :: Parser Text Consonant
pharyngealP = "X" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "?" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
pc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
      where
        pc :: Phonation -> Manner -> Consonant
pc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Pharyngeal

    glottalP :: Parser Text Consonant
glottalP = Text -> Text -> Parser Text Text
doubleArticulatedXSampa "?" "h" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash
        Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiceless (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "?" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiceless Manner
Plosive
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "h" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiceless (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "h" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Manner -> Consonant
gc Phonation
Voiced (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
      where
        gc :: Phonation -> Manner -> Consonant
gc v :: Phonation
v = Phonation -> Place -> Manner -> Consonant
Pulmonic Phonation
v Place
Glottal

ejectiveXSampaP :: Parser Consonant
ejectiveXSampaP :: Parser Text Consonant
ejectiveXSampaP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs Parser Text Consonant -> Parser Text Text -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
ejective
  where
    ejective :: Parser Text Text
ejective = "_>"

    ej :: Place -> Manner -> Consonant
ej       = Place -> Manner -> Consonant
Ejective

    cs :: [Parser Text Consonant]
cs       =
        [ Text -> Text -> Parser Text Text
doubleArticulatedXSampa "q" "X" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Uvular (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "S"
          Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
PostAlveolar (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t`" "s`"
          Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Retroflex (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash
          Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Palatal (Sibilance -> Manner
Affricate Sibilance
Sibilant)
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "k" "x" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Velar (Sibilance -> Manner
Affricate Sibilance
NonSibilant)
        , "p" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Bilabial Manner
Plosive
        , "p" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Bilabial (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "f" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
LabioDental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "T" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Dental (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "t" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar Manner
Plosive
        , "s" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Alveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "S" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
PostAlveolar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "t`" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Retroflex Manner
Plosive
        , "s`" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Retroflex (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "c" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Palatal Manner
Plosive
        , "s" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Palatal (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        , "k" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Velar Manner
Plosive
        , "x" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Velar (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "q" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Uvular Manner
Plosive
        , "X" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place -> Manner -> Consonant
ej Place
Uvular (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        ]

implosiveXSampaP :: Parser Consonant
implosiveXSampaP :: Parser Text Consonant
implosiveXSampaP = Phonation -> Place -> Consonant
Implosive Phonation
Voiceless (Place -> Consonant) -> Parser Text Place -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text Place] -> Parser Text Place
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Place]
cs Parser Text Consonant -> Parser Text Text -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
implosive Parser Text Consonant -> Parser Text Text -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
voiceless
    Parser Text Consonant
-> Parser Text Consonant -> Parser Text Consonant
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Phonation -> Place -> Consonant
Implosive Phonation
Voiced (Place -> Consonant) -> Parser Text Place -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text Place] -> Parser Text Place
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Place]
cs Parser Text Consonant -> Parser Text Text -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
implosive
  where
    voiceless :: Parser Text Text
voiceless = "_0"

    implosive :: Parser Text Text
implosive = "_<"

    cs :: [Parser Text Place]
cs        = [ "b" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Bilabial
                , "d" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Alveolar
                , "d`" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Retroflex
                , "f" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Palatal
                , "g" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Velar
                , "G" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Uvular
                ]

clickXSampaP :: Parser Consonant
clickXSampaP :: Parser Text Consonant
clickXSampaP = Place -> Consonant
Click
    (Place -> Consonant) -> Parser Text Place -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text Place] -> Parser Text Place
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "O" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Bilabial
             , "|" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Dental
             , "!" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Alveolar
             , "|" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> "|" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
PostAlveolar
             , "=" Parser Text Text -> Place -> Parser Text Place
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Place
Palatal
             ]
    Parser Text Consonant -> Parser Text Char -> Parser Text Consonant
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Char
slash

doublyArticulatedXSampaP :: Parser Consonant
doublyArticulatedXSampaP :: Parser Text Consonant
doublyArticulatedXSampaP = [Parser Text Consonant] -> Parser Text Consonant
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text Consonant]
cs
  where
    da :: Phonation -> Place -> Place -> Manner -> Consonant
da = Phonation -> Place -> Place -> Manner -> Consonant
DoublyArticulated

    cs :: [Parser Text Consonant]
cs =
        [ Text -> Text -> Parser Text Text
doubleArticulatedXSampa "n" "m" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Alveolar Manner
Nasal
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "t" "p"
          Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Alveolar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "d" "b"
          Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Alveolar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "N" "m" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Velar Manner
Nasal
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "k" "p"
          Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Velar Manner
Plosive
        , Text -> Text -> Parser Text Text
doubleArticulatedXSampa "g" "b" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Velar Manner
Plosive
        , "H_0" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Palatal (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "H" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Palatal Manner
Approximant
        , "W" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
Bilabial Place
Velar (Sibilance -> Manner
Fricative Sibilance
NonSibilant)
        , "w" Parser Text Text -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiced Place
Bilabial Place
Velar Manner
Approximant
        , "x" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char -> Consonant -> Parser Text Consonant
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> Place -> Place -> Manner -> Consonant
da Phonation
Voiceless Place
PostAlveolar Place
Velar (Sibilance -> Manner
Fricative Sibilance
Sibilant)
        ]

segmentalFeatureXSampaP :: Parser SegmentalFeature
segmentalFeatureXSampaP :: Parser Text SegmentalFeature
segmentalFeatureXSampaP = Parser Text SegmentalFeature
secondaryArticulationP Parser Text SegmentalFeature
-> Parser Text SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [Parser Text SegmentalFeature] -> Parser Text SegmentalFeature
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text SegmentalFeature]
fs
  where
    fs :: [Parser Text SegmentalFeature]
fs = [ "_0" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> SegmentalFeature
Voicing Phonation
Voiceless
         , "_v" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Phonation -> SegmentalFeature
Voicing Phonation
Voiced
         , "::" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
OverLong
         , ":" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
HalfLong
         , ":" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
Long
         , "_X" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Length -> SegmentalFeature
Length Length
ExtraShort
         , "_h" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Aspirated
         , "_O" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
MoreRounded
         , "_c" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
LessRounded
         , "_+" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Advanced
         , "_-" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Retracted
         , "_\"" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Centralized
         , "_x" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
MidCentralized
         , "=" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Syllabic
         , "_^" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
NonSyllabic
         , "`" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Rhotacized
         , "_t" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
BreathyVoice
         , "_k" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
CreakyVoice
         , "_w" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Labialized
         , "'" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Palatalized
         , "_G" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Velarized
         , "_?" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Pharyngealized
         , "_r" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Raised
         , "_o" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Lowered
         , "_A" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
AdvancedTongueRoot
         , "_q" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
RetractedTongueRoot
         , "_d" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Dentalized
         , "_a" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Apical
         , "_m" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Laminal
         , "~" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
Nasalized
         , "_l" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
LateralRelease
         , "_}" Parser Text Text
-> SegmentalFeature -> Parser Text SegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SegmentalFeature
NoAudibleRelease
         ]

suprasegmentalFeatureXSampaP :: Parser SuprasegmentalFeature
suprasegmentalFeatureXSampaP :: Parser Text SuprasegmentalFeature
suprasegmentalFeatureXSampaP = [Parser Text SuprasegmentalFeature]
-> Parser Text SuprasegmentalFeature
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [Parser Text SuprasegmentalFeature]
fs
  where
    fs :: [Parser Text SuprasegmentalFeature]
fs           =
        [ Parser Text SuprasegmentalFeature
toneContourP, Parser Text SuprasegmentalFeature
levelToneP, "." Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SuprasegmentalFeature
Break, "-" Parser Text Text -> Parser Text Char -> Parser Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text Char
slash Parser Text Char
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SuprasegmentalFeature
Linking ]

    levelToneP :: Parser Text SuprasegmentalFeature
levelToneP   = LevelTone -> SuprasegmentalFeature
LevelLexicalTone
        (LevelTone -> SuprasegmentalFeature)
-> Parser Text LevelTone -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text LevelTone] -> Parser Text LevelTone
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "_T" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
ExtraHighTone
                 , "_H" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
HighTone
                 , "_M" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
MidTone
                 , "_L" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
LowTone
                 , "_B" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
ExtraLowTone
                 , "!" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
DownStep
                 , "^" Parser Text Text -> LevelTone -> Parser Text LevelTone
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> LevelTone
UpStep
                 ]

    toneContourP :: Parser Text SuprasegmentalFeature
toneContourP = ToneContour -> SuprasegmentalFeature
LexicalToneContour
        (ToneContour -> SuprasegmentalFeature)
-> Parser Text ToneContour -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Parser Text ToneContour] -> Parser Text ToneContour
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ "_R" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
Rising
                 , "_F" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
Falling
                 , "_H_T" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
HighRising
                 , "_B_L" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
LowRising
                 , "_H_F" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
HighFalling
                 , "_L_B" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
LowFalling
                 , "_R_F" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
RisingFalling
                 , "_F_R" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
FallingRising
                 , "<R>" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
GlobalRise
                 , "<F>" Parser Text Text -> ToneContour -> Parser Text ToneContour
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ToneContour
GlobalFall
                 ]

slash :: Parser Char
slash :: Parser Text Char
slash = Char -> Parser Text Char
P.char '\\'

doubleArticulatedXSampa :: Text -> Text -> Parser Text
doubleArticulatedXSampa :: Text -> Text -> Parser Text Text
doubleArticulatedXSampa x :: Text
x y :: Text
y = Text -> Parser Text Text
P.string (Text -> Parser Text Text) -> Text -> Parser Text Text
forall a b. (a -> b) -> a -> b
$ Text
x Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> "_" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
y

stressXSampaP :: Parser SuprasegmentalFeature
stressXSampaP :: Parser Text SuprasegmentalFeature
stressXSampaP = ("\"" Parser Text Text -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "\'") Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Stress -> SuprasegmentalFeature
Stress Stress
Primary Parser Text SuprasegmentalFeature
-> Parser Text SuprasegmentalFeature
-> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> "%" Parser Text Text
-> SuprasegmentalFeature -> Parser Text SuprasegmentalFeature
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Stress -> SuprasegmentalFeature
Stress Stress
Secondary