{-# OPTIONS_HADDOCK show-extensions #-}
-- |
-- Module : Phonetic.Languages.Array.General.PropertiesSyllablesG2
-- Copyright : (c) OleksandrZhabenko 2020-2021
-- License : MIT
-- Stability : Experimental
-- Maintainer : olexandr543@yahoo.com
--
-- Generalization and extension of the functionality of the DobutokO.Poetry.Norms
-- and DobutokO.Poetry.Norms.Extended modules
-- from the @dobutokO-poetry@ package and more recent package @phonetic-languages-simplified-properties-array@.
-- Uses syllables information.
-- Instead of the vector-related, uses just arrays.
-- If you use the functionality of the Phonetic.Languages.Array.Ukrainian.PropertiesSyllablesG2 module,
-- then import it qualified (or this module) because they have many common data. Is provided as a standalone one
-- to reduce dependencies list in general case.
{-# LANGUAGE CPP, BangPatterns #-}
module Phonetic.Languages.Array.General.PropertiesSyllablesG2 (
-- * Newtype to work with
CoeffTwo(..)
, Coeffs2
, isEmpty
, isPair
, fstCF
, sndCF
, readCF
-- * Rhythmicity properties (semi-empirical)
-- ** Simple one
, rhythmicity0i
, rhythmicity0Fi
-- ** With weight coefficients
, rhythmicityKi
, rhythmicityKFi
-- * General
, rhythmicityG
, rhythmicity
) where
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=710
/* code that applies only to GHC 7.10.* and higher versions */
import GHC.Base (mconcat)
#endif
#endif
import Languages.Rhythmicity
import Languages.Rhythmicity.Factor
import Data.Phonetic.Languages.Base
import Data.Phonetic.Languages.Syllables
import Data.Maybe (isNothing,fromMaybe)
import Text.Read (readMaybe)
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif
data CoeffTwo a = CF0 | CF2 (Maybe a) (Maybe a) deriving (Eq)
isEmpty :: CoeffTwo a -> Bool
isEmpty CF0 = True
isEmpty _ = False
isPair :: CoeffTwo a -> Bool
isPair CF0 = False
isPair _ = True
fstCF :: CoeffTwo a -> Maybe a
fstCF (CF2 x _) = x
fstCF _ = Nothing
sndCF :: CoeffTwo a -> Maybe a
sndCF (CF2 _ y) = y
sndCF _ = Nothing
readCF :: String -> Coeffs2
readCF xs
| any (== '_') xs = let (!ys,!zs) = (\(ks,ts) -> (readMaybe ks::Maybe Double,readMaybe (drop 1 ts)::Maybe Double)) . break (== '_') $ xs in
if (isNothing ys && isNothing zs) then CF0 else CF2 ys zs
| otherwise = CF0
type Coeffs2 = CoeffTwo Double
--------------------------------------------------------------------------------------------
eval23 = evalRhythmicity23 . mconcat
{-# INLINE eval23 #-}
eval23K k2 k3 = evalRhythmicity23K k2 k3 . mconcat
{-# INLINE eval23K #-}
eval23F k = evalRhythmicity23F k . mconcat
{-# INLINE eval23F #-}
eval23KF k k2 k3 = evalRhythmicity23KF k k2 k3 . mconcat
{-# INLINE eval23KF #-}
rhythmicityG
:: ([[[PRS]]] -> [[Double]])
-> ([[Double]] -> Double)
-> GWritingSystemPRPLX
-> [(Char,Char)]
-> CharPhoneticClassification
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicityG f g wrs ks arr hs us vs xs
| null xs = 0.0
| otherwise = g . f . createSyllablesPL wrs ks arr hs us vs $ xs
{-# INLINE rhythmicityG #-}
-------------------------------------------------------
rhythmicity0i
:: ([[[PRS]]] -> [[Double]])
-> GWritingSystemPRPLX
-> [(Char,Char)]
-> CharPhoneticClassification
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicity0i f = rhythmicityG f eval23
{-# INLINE rhythmicity0i #-}
-------------------------------------------------------
rhythmicityKi
:: ([[[PRS]]] -> [[Double]])
-> Double
-> Double
-> GWritingSystemPRPLX
-> [(Char,Char)]
-> CharPhoneticClassification
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicityKi f k2 k3 = rhythmicityG f (eval23K k2 k3)
{-# INLINE rhythmicityKi #-}
--------------------------------------------------------
rhythmicity0Fi
:: ([[[PRS]]] -> [[Double]])
-> Double
-> GWritingSystemPRPLX
-> [(Char,Char)]
-> CharPhoneticClassification
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicity0Fi f k = rhythmicityG f (eval23F k)
{-# INLINE rhythmicity0Fi #-}
--------------------------------------------------------
rhythmicityKFi
:: ([[[PRS]]] -> [[Double]])
-> Double
-> Double
-> Double
-> GWritingSystemPRPLX
-> [(Char,Char)]
-> CharPhoneticClassification
-> SegmentRulesG
-> String -- ^ Corresponds to the \'0\' symbol delimiter in the @ukrainian-phonetics-basic-array@ package.
-> String -- ^ Corresponds to the \'1\' and \'-\' symbol delimiters in the @ukrainian-phonetics-basic-array@ package.
-> String
-> Double
rhythmicityKFi f k k2 k3 = rhythmicityG f (eval23KF k k2 k3)
{-# INLINE rhythmicityKFi #-}
--------------------------------------------------------
{-| It is intended to provide different functions :: 'Double' -> 'String' -> ([[['PRS']]] -> [['Double']]) for at least the
following values: \"0z\", \"02z\", \"03z\", \"04z\", \"0y\", \"02y\", \"03y\" and the default one for other variants.
The \"z\"-line uses \'F\' functions.
-}
rhythmicity
:: Double
-> String
-> (Double -> String -> ([[[PRS]]] -> [[Double]]))
-> Coeffs2
-> GWritingSystemPRPLX
-> [(Char,Char)]
-> CharPhoneticClassification
-> SegmentRulesG
-> String
-> String
-> String
-> Double
rhythmicity k choice h CF0
| choice `elem` ["0z","02z","03z","04z"] = rhythmicity0Fi f k
| otherwise = rhythmicity0i f
where f = h k choice
rhythmicity k choice h (CF2 x y)
| choice `elem` ["0z","02z","03z","04z"] = rhythmicityKFi f k (fromMaybe 1.0 x) (fromMaybe 1.0 y)
| otherwise = rhythmicityKi f (fromMaybe 1.0 x) (fromMaybe 1.0 y)
where f = h k choice