{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK show-extensions #-}

{- |
Module      :  Aftovolio.Ukrainian.Common2
Copyright   :  (c) Oleksandr Zhabenko 2021-2023
License     :  MIT
Maintainer  :  oleksandr.zhabenko@yahoo.com

Functions provide functionality of a musical instrument synthesizer or for Ukrainian speech synthesis
especially for poets, translators and writers. Is rewritten from the module Melodics.ByteString.Ukrainian.Arr
for optimization purposes. Contains the common for two modules definitions.
Phonetic material is taken from the :

Solomija Buk, Ján Mačutek, Andrij Rovenchak. Some properties of
the Ukrainian writing system. [Electronic resource] https://arxiv.org/ftp/arxiv/papers/0802/0802.4198.pdf
-}
module Aftovolio.Ukrainian.Common2 where

import CaseBi.Arr
import GHC.Arr (Array (..))
import GHC.Base
import GHC.List (repeat, zip)
import Text.Show (Show (..))

{-
-- Inspired by: https://mail.haskell.org/pipermail/beginners/2011-October/008649.html
-- -}

data Triple = Z | O | T
    deriving (Triple -> Triple -> Bool
(Triple -> Triple -> Bool)
-> (Triple -> Triple -> Bool) -> Eq Triple
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Triple -> Triple -> Bool
== :: Triple -> Triple -> Bool
$c/= :: Triple -> Triple -> Bool
/= :: Triple -> Triple -> Bool
Eq, Eq Triple
Eq Triple =>
(Triple -> Triple -> Ordering)
-> (Triple -> Triple -> Bool)
-> (Triple -> Triple -> Bool)
-> (Triple -> Triple -> Bool)
-> (Triple -> Triple -> Bool)
-> (Triple -> Triple -> Triple)
-> (Triple -> Triple -> Triple)
-> Ord Triple
Triple -> Triple -> Bool
Triple -> Triple -> Ordering
Triple -> Triple -> Triple
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Triple -> Triple -> Ordering
compare :: Triple -> Triple -> Ordering
$c< :: Triple -> Triple -> Bool
< :: Triple -> Triple -> Bool
$c<= :: Triple -> Triple -> Bool
<= :: Triple -> Triple -> Bool
$c> :: Triple -> Triple -> Bool
> :: Triple -> Triple -> Bool
$c>= :: Triple -> Triple -> Bool
>= :: Triple -> Triple -> Bool
$cmax :: Triple -> Triple -> Triple
max :: Triple -> Triple -> Triple
$cmin :: Triple -> Triple -> Triple
min :: Triple -> Triple -> Triple
Ord, Int -> Triple -> ShowS
[Triple] -> ShowS
Triple -> String
(Int -> Triple -> ShowS)
-> (Triple -> String) -> ([Triple] -> ShowS) -> Show Triple
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Triple -> ShowS
showsPrec :: Int -> Triple -> ShowS
$cshow :: Triple -> String
show :: Triple -> String
$cshowList :: [Triple] -> ShowS
showList :: [Triple] -> ShowS
Show)

isUkrainianL :: Char -> Bool
isUkrainianL :: Char -> Bool
isUkrainianL Char
y
    | (Char
y Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'\1070' Bool -> Bool -> Bool
&& Char
y Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\1097') = Bool
True
    | Bool
otherwise =
        Bool -> [(Char, Bool)] -> Char -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted'
            Bool
False
            ( (Char -> (Char, Bool)) -> String -> [(Char, Bool)]
forall a b. (a -> b) -> [a] -> [b]
map
                (\Char
x -> (Char
x, Bool
True))
                String
"'-\700\1028\1030\1031\1068\1100\1102\1103\1108\1110\1111\1168\1169\8217"
            )
            Char
y

isUkrainianLTup :: Array Int (Char, Bool) -> Char -> Bool
isUkrainianLTup :: Array Int (Char, Bool) -> Char -> Bool
isUkrainianLTup !Array Int (Char, Bool)
tup15 Char
y
    | (Char
y Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'\1070' Bool -> Bool -> Bool
&& Char
y Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\1097') = Bool
True
    | Bool
otherwise = (Bool, Array Int (Char, Bool)) -> Char -> Bool
forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (Char, Bool)
tup15) Char
y

isConsNotJ :: Char -> Bool
isConsNotJ :: Char -> Bool
isConsNotJ =
    Bool -> [(Char, Bool)] -> Char -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted'
        Bool
False
        ( String -> [Bool] -> [(Char, Bool)]
forall a b. [a] -> [b] -> [(a, b)]
zip
            String
"\1073\1074\1075\1076\1078\1079\1082\1083\1084\1085\1087\1088\1089\1090\1092\1093\1094\1095\1096\1097\1169"
            (Bool -> [Bool]
forall a. a -> [a]
repeat Bool
True)
        )

isConsNotJTup :: Array Int (Char, Bool) -> Char -> Bool
isConsNotJTup :: Array Int (Char, Bool) -> Char -> Bool
isConsNotJTup !Array Int (Char, Bool)
tup16 = (Bool, Array Int (Char, Bool)) -> Char -> Bool
forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (Char, Bool)
tup16)