-- |
-- Module      :  Languages.Phonetic.Ukrainian.PrepareText
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to order the 7 or less Ukrainian words (or their concatenations)
-- to obtain (to some extent) suitable for poetry or music text.
-- Earlier it has been a module DobutokO.Poetry.Ukrainian.PrepareText
-- from the @dobutokO-poetry@ package.
-- In particular, this module can be used to prepare the Ukrainian text
-- by applying the most needed grammar to avoid misunderstanding
-- for the produced text. The attention is paid to the prepositions, pronouns, conjunctions
-- and particles that are most commonly connected (or not) in a significant way
-- with the next text.
-- Uses the information from:
-- https://uk.wikipedia.org/wiki/%D0%A1%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%BD%D0%B8%D0%BA
-- and
-- https://uk.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BA%D0%B0_(%D0%BC%D0%BE%D0%B2%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%BE)
--

module Languages.Phonetic.Ukrainian.PrepareText (
  -- * Basic functions
  prepareText
  , prepareTextN
  , complexWords
  , splitLines
  , splitLinesN
  , auxiliary1
  , isPreposition
  , isConcatenated
  , isSpC
  , concatenated2
  , jottedConv
  -- * Used to transform after convertToProperUkrainian from mmsyn6ukr package
  , aux4
  , aux0
) where

import CaseBi (getBFst')
import Data.List.InnToOut.Basic (mapI)
import Data.Char (isAlpha,toLower)
import qualified Data.Vector as V

-- | Is used to convert a Ukrainian text into list of 'String' each of which is ready to be
-- used by the functions from the other modules in the package.
-- It applies minimal grammar links and connections between the most commonly used Ukrainian
-- words that \"should\" be paired and not dealt with separately
-- to avoid the misinterpretation and preserve maximum of the semantics for the
-- \"phonetic\" language on the Ukrainian basis.
prepareText :: String -> [String]
prepareText :: String -> [String]
prepareText = (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Char -> Bool
isUkrainianL) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
splitLines ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ([String] -> String
unwords ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
concatenated2([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
auxiliary1 ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
complexWords ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> [String]) -> (String -> String) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
t -> Char -> Bool
isAlpha Char
t Bool -> Bool -> Bool
|| Char -> Bool
isSpC Char
t)) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines

-- | Concatenates complex words in Ukrainian so that they are not separated further by possible words order rearrangements (because they are treated
-- as a single word). This is needed to preserve basic grammar in phonetic languages.
complexWords :: [String] -> [String]
complexWords :: [String] -> [String]
complexWords (String
xs:String
ys:String
zs:String
ts:[String]
xss) =
 ([String], Vector (String, [String])) -> String -> [String]
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (String
xsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
ysString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss),[(String, [String])] -> Vector (String, [String])
forall a. [a] -> Vector a
V.fromList [(String
"\1074",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1084\1110\1088\1091" Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1075\1086" Bool -> Bool -> Bool
&&
    String
ts String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts String -> String -> String
forall a. [a] -> [a] -> [a]
++ ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
xss))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    [String] -> [String]
complexWords (Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 [String]
xss) else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)),
    (String
"\1076\1072\1088\1084\1072", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1076\1083\1103",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1075\1086" Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086\1073"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords [String]
xss
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1079",
      case String
ys of
        String
"\1090\1080\1084" -> if String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086\1073"
          then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
          else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
        String
"\1090\1086\1075\1086" -> if String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1095\1072\1089\1091" Bool -> Bool -> Bool
&& String
ts String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082"
          then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\1081\1072\1082" String -> String -> String
forall a. [a] -> [a] -> [a]
++
          ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
xss))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 [String]
xss)
          else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
        String
_ -> (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1079\1072\1084\1110\1089\1090\1100",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1075\1086" Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086\1073"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords [String]
xss
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1087\1086\1087\1088\1080",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1077" Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords [String]
xss
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1087\1088\1080",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1094\1100\1086\1084\1091" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1087\1110\1089\1083\1103",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1075\1086" Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords [String]
xss
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1090\1072\1082", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss) else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)),
    (String
"\1090\1080\1084\1095\1072\1089\1086\1084", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss) else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)),
    (String
"\1090\1086\1084\1091", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\1081\1072\1082" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1091", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1084\1110\1088\1091" Bool -> Bool -> Bool
&&
    String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1075\1086" Bool -> Bool -> Bool
&& String
ts String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts String -> String -> String
forall a. [a] -> [a] -> [a]
++
    ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
xss))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 [String]
xss) else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)),
    (String
"\1093\1086\1095", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080" then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
    else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)), (String
"\1093\1086\1095", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss) else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)),
    (String
"\1095\1077\1088\1077\1079", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1077" Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
    then (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ts)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords [String]
xss else (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss))]) String
xs
complexWords (String
xs:String
ys:String
zs:[String]
_) =
 ([String], Vector (String, [String])) -> String -> [String]
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' ([String
xs,String
ys,String
zs],[(String, [String])] -> Vector (String, [String])
forall a. [a] -> Vector a
V.fromList [
    (String
"\1076\1072\1088\1084\1072", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
    then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs]
    else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]), (String
"\1079",
      case String
ys of
        String
"\1090\1080\1084" -> if String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086\1073"
          then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs]
          else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]
        String
_ -> [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]), (String
"\1087\1088\1080",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1094\1100\1086\1084\1091" then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs]
    else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]), (String
"\1090\1072\1082", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
    then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs] else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]),     (String
"\1090\1080\1084\1095\1072\1089\1086\1084",
    if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs] else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys, String
zs]),
    (String
"\1090\1086\1084\1091", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\1081\1072\1082" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs]
    else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]), (String
"\1093\1086\1095", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080" then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs]
    else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs]), (String
"\1093\1086\1095", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080"
    then [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs] else [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys,String
zs])]) String
xs
complexWords [String]
xss = [String]
xss

-- | Since 0.2.1.0 version the function is recursive and is applied so that all returned elements ('String') are no longer than 7 words in them.
splitLines :: [String] -> [String]
splitLines :: [String] -> [String]
splitLines [String]
xss
 | [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss = []
 | Bool
otherwise = (String -> Bool) -> (String -> [String]) -> [String] -> [String]
forall a. (a -> Bool) -> (a -> [a]) -> [a] -> [a]
mapI (\String
xs -> Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
xs) Int
7 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT) (\String
xs -> let yss :: [String]
yss = String -> [String]
words String
xs in
     [String] -> [String]
splitLines ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([String] -> String) -> [[String]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map [String] -> String
unwords ([[String]] -> [String])
-> ([String] -> [[String]]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\([String]
q,[String]
r) -> [[String]
q,[String]
r]) (([String], [String]) -> [[String]])
-> ([String] -> ([String], [String])) -> [String] -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
yss Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
2) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
yss) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
xss

-- | A generalized variant of the 'splitLines' with the arbitrary maximum number of the words in the lines given as the first argument.
splitLinesN :: Int -> [String] -> [String]
splitLinesN :: Int -> [String] -> [String]
splitLinesN Int
n [String]
xss
 | [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss Bool -> Bool -> Bool
|| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = []
 | Bool
otherwise = (String -> Bool) -> (String -> [String]) -> [String] -> [String]
forall a. (a -> Bool) -> (a -> [a]) -> [a] -> [a]
mapI (\String
xs -> Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
xs) Int
n Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT) (\String
xs -> let yss :: [String]
yss = String -> [String]
words String
xs in
     [String] -> [String]
splitLines ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([String] -> String) -> [[String]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map [String] -> String
unwords ([[String]] -> [String])
-> ([String] -> [[String]]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\([String]
q,[String]
r) -> [[String]
q,[String]
r]) (([String], [String]) -> [[String]])
-> ([String] -> ([String], [String])) -> [String] -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
yss Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
2) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
yss) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
xss

-- | A generalized variant of the 'prepareText' with the arbitrary maximum number of the words in the lines given as the first argument.
prepareTextN :: Int -> String -> [String]
prepareTextN :: Int -> String -> [String]
prepareTextN Int
n = (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Char -> Bool
isUkrainianL) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
splitLinesN Int
n ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ([String] -> String
unwords ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
concatenated2([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
auxiliary1 ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [String]
complexWords ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> [String]) -> (String -> String) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
t -> Char -> Bool
isAlpha Char
t Bool -> Bool -> Bool
|| Char -> Bool
isSpC Char
t)) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines


auxiliary1 :: [String] -> [String]
auxiliary1 :: [String] -> [String]
auxiliary1 (String
xs:String
ys:String
zs:[String]
xss)
  | String -> Bool
isConcatenated String
ys Bool -> Bool -> Bool
|| String -> Bool
isPreposition String
ys =
      [String] -> [String]
auxiliary1 (String
xsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
auxiliary1 ((String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
jottedConv (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String
zs))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss))
  | String -> Bool
isConcatenated String
xs Bool -> Bool -> Bool
|| String -> Bool
isPreposition String
xs = [String] -> [String]
auxiliary1 ((String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
jottedConv (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String
ys))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
  | Bool
otherwise = String
xsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
auxiliary1 (String
ysString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
auxiliary1 x :: [String]
x@(String
xs:String
ys:[String]
xss)
  | String -> Bool
isConcatenated String
xs Bool -> Bool -> Bool
|| String -> Bool
isPreposition String
xs = [String] -> [String]
auxiliary1 ((String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
jottedConv (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String
ys))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
  | Bool
otherwise = [String]
x
auxiliary1 [String]
xss = [String]
xss

isPreposition :: String -> Bool
isPreposition :: String -> Bool
isPreposition String
ts =
  (Bool, Vector (String, Bool)) -> String -> Bool
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (Bool
False, [(String, Bool)] -> Vector (String, Bool)
forall a. [a] -> Vector a
V.fromList ([(String, Bool)] -> Vector (String, Bool))
-> ([Bool] -> [(String, Bool)]) -> [Bool] -> Vector (String, Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   [String] -> [Bool] -> [(String, Bool)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String
"\1030\1079", String
"\1041\1077\1079", String
"\1041\1110\1083\1103", String
"\1042",
    String
"\1042\1110\1076", String
"\1044\1083\1103", String
"\1044\1086", String
"\1047",
     String
"\1047\1072", String
"\1047\1072\1088\1072\1076\1080", String
"\1047\1110",
      String
"\1050", String
"\1050\1086\1083\1086", String
"\1050\1088\1110\1079\1100",
       String
"\1050\1088\1110\1084", String
"\1052\1077\1078", String
"\1052\1077\1078\1080",
        String
"\1052\1110\1078", String
"\1053\1072", String
"\1053\1072\1076", String
"\1054",
         String
"\1054\1073", String
"\1054\1076", String
"\1054\1082\1088\1110\1084",
          String
"\1055\1077\1088\1077\1076", String
"\1055\1086", String
"\1055\1088\1080",
           String
"\1055\1088\1086", String
"\1055\1088\1086\1090\1080",
            String
"\1055\1110\1076", String
"\1055\1110\1089\1083\1103",
             String
"\1057\1077\1088\1077\1076", String
"\1057\1077\1088\1077\1076\1080",
              String
"\1059", String
"\1063\1077\1088\1077\1079", String
"\1073\1077\1079",
               String
"\1073\1110\1083\1103", String
"\1074", String
"\1074\1110\1076",
                String
"\1076\1083\1103", String
"\1076\1086", String
"\1079", String
"\1079\1072",
                 String
"\1079\1072\1088\1072\1076\1080", String
"\1079\1110",
                  String
"\1082", String
"\1082\1086\1083\1086", String
"\1082\1088\1110\1079\1100",
                   String
"\1082\1088\1110\1084", String
"\1084\1077\1078", String
"\1084\1077\1078\1080",
                    String
"\1084\1110\1078", String
"\1085\1072", String
"\1085\1072\1076", String
"\1086",
                     String
"\1086\1073", String
"\1086\1076", String
"\1086\1082\1088\1110\1084",
                      String
"\1087\1077\1088\1077\1076", String
"\1087\1086", String
"\1087\1088\1080",
                       String
"\1087\1088\1086", String
"\1087\1088\1086\1090\1080", String
"\1087\1110\1076",
                        String
"\1087\1110\1089\1083\1103", String
"\1089\1077\1088\1077\1076",
                         String
"\1089\1077\1088\1077\1076\1080", String
"\1091",
                          String
"\1095\1077\1088\1077\1079", String
"\1110\1079"] ([Bool] -> Vector (String, Bool))
-> [Bool] -> Vector (String, Bool)
forall a b. (a -> b) -> a -> b
$
                           Int -> Bool -> [Bool]
forall a. Int -> a -> [a]
replicate Int
200 Bool
True) String
ts
{-# INLINE isPreposition #-}

-- | Since the dobutokO-poetry version 0.16.3.0 the (||) operator has been changed to the (&&).
-- The idea is that these words are the ones that are pronouns and they \"should\" be treated
-- (by the author's understanding) as independent words.
isConcatenated :: String -> Bool
isConcatenated :: String -> Bool
isConcatenated String
ts
 | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
ts = Bool
False
 | Bool
otherwise = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
ts) Int
2 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT Bool -> Bool -> Bool
&& (Bool, Vector (String, Bool)) -> String -> Bool
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (Bool
True, [(String, Bool)] -> Vector (String, Bool)
forall a. [a] -> Vector a
V.fromList ([(String, Bool)] -> Vector (String, Bool))
-> ([Bool] -> [(String, Bool)]) -> [Bool] -> Vector (String, Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
     [String] -> [Bool] -> [(String, Bool)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String
"\1028", String
"\1042\1080", String
"\1052\1080", String
"\1058\1080", String
"\1058\1110",
       String
"\1062\1110", String
"\1071", String
"\1074\1080", String
"\1084\1080", String
"\1090\1080", String
"\1090\1110",
         String
"\1094\1110", String
"\1103", String
"\1108"] ([Bool] -> Vector (String, Bool))
-> [Bool] -> Vector (String, Bool)
forall a b. (a -> b) -> a -> b
$ Int -> Bool -> [Bool]
forall a. Int -> a -> [a]
replicate Int
14 Bool
False) String
ts Bool -> Bool -> Bool
&&
           (String -> Char
forall a. [a] -> a
head String
ts Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` String
"\1031\1111")
{-# INLINE isConcatenated #-}

concatenated2 :: [String] -> [String]
concatenated2 :: [String] -> [String]
concatenated2 (String
xs:String
ys:[String]
xss) =
 ([String], Vector (String, [String])) -> String -> [String]
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (String
xsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
concatenated2 (String
ysString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss), [(String, [String])] -> Vector (String, [String])
forall a. [a] -> Vector a
V.fromList ([(String, [String])] -> Vector (String, [String]))
-> ([[String]] -> [(String, [String])])
-> [[String]]
-> Vector (String, [String])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [[String]] -> [(String, [String])]
forall a b. [a] -> [b] -> [(a, b)]
zip [String
"\1040\1073\1086",String
"\1040\1076\1078\1077",
 String
"\1040\1083\1077",String
"\1040\1085\1110\1078",String
"\1041\1086\1076\1072\1081",
 String
"\1041\1091\1094\1110\1084\1090\1086",String
"\1042\1078\1077",String
"\1042\1080\1082\1083\1102\1095\1085\1086",
 String
"\1042\1083\1072\1089\1085\1077",String
"\1042\1090\1110\1084",String
"\1044\1072\1074\1072\1081",
 String
"\1047\1072\1090\1077",String
"\1050\1086\1083\1080",String
"\1051\1077\1076\1074\1077",String
"\1051\1080\1096\1077",
 String
"\1052\1072\1081\1078\1077",String
"\1052\1086\1074",String
"\1052\1086\1074\1073\1080",
 String
"\1052\1086\1074\1073\1080\1090\1086",String
"\1053\1072\1074\1110\1090\1100",
 String
"\1053\1072\1089\1082\1110\1083\1100\1082\1080",String
"\1053\1072\1095\1077",String
"\1053\1072\1095\1077\1073",
 String
"\1053\1072\1095\1077\1073\1090\1086",String
"\1053\1077\1074\1078\1077",String
"\1053\1077\1084\1086\1074",
 String
"\1053\1077\1084\1086\1074\1073\1080",String
"\1053\1077\1084\1086\1074\1073\1080\1090\1086",
 String
"\1053\1077\1085\1072\1095\1077",String
"\1053\1077\1085\1072\1095\1077\1073\1090\1086",
 String
"\1053\1077\1093\1072\1081",String
"\1053\1090\1078\1077",String
"\1053\1110\1073\1080",
 String
"\1053\1110\1073\1080\1090\1086",String
"\1053\1110\1078",String
"\1054\1090\1086\1078",
 String
"\1055\1088\1080\1090\1086\1084\1091",String
"\1055\1088\1080\1090\1110\1084",
 String
"\1055\1088\1080\1095\1086\1084\1091",String
"\1055\1088\1080\1095\1110\1084",
 String
"\1055\1088\1086\1090\1077",String
"\1057\1072\1084\1077",String
"\1057\1077\1073\1090\1086",
 String
"\1058\1072\1082\1080",String
"\1058\1086\1073\1090\1086",String
"\1058\1110\1083\1100\1082\1080",
 String
"\1061\1072\1081",String
"\1061\1086\1095",String
"\1061\1110\1073\1072",String
"\1062\1077\1073\1090\1086",
 String
"\1065\1086\1073",String
"\1071\1082\1073\1080",String
"\1071\1082\1088\1072\1079",String
"\1071\1082\1097\1086",
 String
"\1072\1073\1086",String
"\1072\1076\1078\1077",String
"\1072\1083\1077",String
"\1072\1085\1110\1078",
 String
"\1073\1086\1076\1072\1081",String
"\1073\1091\1094\1110\1084\1090\1086",String
"\1074\1078\1077",
 String
"\1074\1080\1082\1083\1102\1095\1085\1086",String
"\1074\1083\1072\1089\1085\1077",
 String
"\1074\1090\1110\1084",String
"\1076\1072\1074\1072\1081",String
"\1079\1072\1090\1077",String
"\1082\1086\1083\1080",
 String
"\1083\1077\1076\1074\1077",String
"\1083\1080\1096\1077",String
"\1084\1072\1081\1078\1077",String
"\1084\1086\1074",
 String
"\1084\1086\1074\1073\1080",String
"\1084\1086\1074\1073\1080\1090\1086",String
"\1085\1072\1074\1110\1090\1100",
 String
"\1085\1072\1089\1082\1110\1083\1100\1082\1080",String
"\1085\1072\1095\1077",String
"\1085\1072\1095\1077\1073",
 String
"\1085\1072\1095\1077\1073\1090\1086",String
"\1085\1077\1074\1078\1077",String
"\1085\1077\1084\1086\1074",
 String
"\1085\1077\1084\1086\1074\1073\1080",String
"\1085\1077\1084\1086\1074\1073\1080\1090\1086",
 String
"\1085\1077\1085\1072\1095\1077",String
"\1085\1077\1085\1072\1095\1077\1073\1090\1086",
 String
"\1085\1077\1093\1072\1081",String
"\1085\1110\1073\1080",String
"\1085\1110\1073\1080\1090\1086",
 String
"\1085\1110\1078",String
"\1086\1090\1078\1077",String
"\1086\1090\1086\1078",String
"\1087\1088\1080\1090\1086\1084\1091",
 String
"\1087\1088\1080\1090\1110\1084",String
"\1087\1088\1080\1095\1086\1084\1091",String
"\1087\1088\1080\1095\1110\1084",
 String
"\1087\1088\1086\1090\1077",String
"\1089\1072\1084\1077",String
"\1089\1077\1073\1090\1086",String
"\1090\1072\1082\1080",
 String
"\1090\1086\1073\1090\1086",String
"\1090\1110\1083\1100\1082\1080",String
"\1093\1072\1081",String
"\1093\1086\1095",
 String
"\1093\1110\1073\1072",String
"\1094\1077\1073\1090\1086",String
"\1097\1086\1073",String
"\1103\1082\1073\1080",
 String
"\1103\1082\1088\1072\1079",String
"\1103\1082\1097\1086"] ([[String]] -> Vector (String, [String]))
-> [[String]] -> Vector (String, [String])
forall a b. (a -> b) -> a -> b
$ Int -> [String] -> [[String]]
forall a. Int -> a -> [a]
replicate Int
200 ((String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
jottedConv (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String
ys))String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
concatenated2 [String]
xss)) String
xs
concatenated2 [String]
xss = [String]
xss

isSpC :: Char -> Bool
isSpC :: Char -> Bool
isSpC Char
x = Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\'' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
' ' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\x2019' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\x02BC' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-'
{-# INLINE isSpC #-}

jottedConv :: String -> String
jottedConv :: String -> String
jottedConv (Char
x:Char
y:String
xs)
  | Char -> Bool
isSpC Char
x = Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:((String, Vector (Char, String)) -> Char -> String
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (String -> String
jottedConv (Char
yChar -> String -> String
forall a. a -> [a] -> [a]
:String
xs), [(Char, String)] -> Vector (Char, String)
forall a. [a] -> Vector a
V.fromList
     [(Char
'\1028', Char
'\1049'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1077'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1031', Char
'\1049'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1110'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1070', Char
'\1049'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1091'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1071', Char
'\1049'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1072'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1102', Char
'\1081'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1091'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1103', Char
'\1081'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1072'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1108', Char
'\1081'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1077'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs),
      (Char
'\1111', Char
'\1081'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\1110'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv String
xs)]) Char
y)
  | Bool
otherwise = Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String -> String
jottedConv (Char
yChar -> String -> String
forall a. a -> [a] -> [a]
:String
xs)
jottedConv String
xs = String
xs

-- | Can be used to prepare the text after 'convertToProperUkrainian' from 'Melodics.Ukrainian' module from @mmsyn6ukr@ package so that all the 'String' can
-- be represented as unique 'Char'.
aux4 :: String -> Char
aux4 :: String -> Char
aux4 String
xs
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1076\1078" = Char
'j'
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1076\1079" = Char
'z'
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1089\1100" = Char
's'
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1094\1100" = Char
'c'
  | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs = String -> Char
forall a. HasCallStack => String -> a
error String
"Languages.Phonetic.Ukrainian.PrepareText.aux4: Empty String. "
  | Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs

-- | Can be used to prepare the text after 'convertToProperUkrainian' from 'Melodics.Ukrainian' module from @mmsyn6ukr@ package so that all the 'String' can
-- be represented as unique 'Char'. Afterwards, all the palatalized or semi-palatalized sounds are represented just the same as not palatalized ones.
aux0 :: V.Vector String -> V.Vector Char
aux0 :: Vector String -> Vector Char
aux0 Vector String
v
  | Vector String -> Bool
forall a. Vector a -> Bool
V.null Vector String
v = Vector Char
forall a. Vector a
V.empty
  | Bool
otherwise = (String -> Char) -> Vector String -> Vector Char
forall a b. (a -> b) -> Vector a -> Vector b
V.map String -> Char
forall a. [a] -> a
head (Vector String -> Vector Char)
-> (Vector String -> Vector String) -> Vector String -> Vector Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> Vector String -> Vector String
forall a. (a -> Bool) -> Vector a -> Vector a
V.filter (Bool -> Bool
not(Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) (Vector String -> Vector String)
-> (Vector String -> Vector String)
-> Vector String
-> Vector String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> Vector String -> Vector String
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\String
xs ->
     case String
xs of
      String
"\1089\1100" -> String
"\1089"
      String
"\1094\1100" -> String
"\1094"
      String
"\1076\1078" -> String
"j"
      String
"\1076\1079" -> String
"z"
      String
_            -> String
xs) (Vector String -> Vector String)
-> (Vector String -> Vector String)
-> Vector String
-> Vector String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> Vector String -> Vector String
forall a. (a -> Bool) -> Vector a -> Vector a
V.filter (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"\1100") (Vector String -> Vector Char) -> Vector String -> Vector Char
forall a b. (a -> b) -> a -> b
$ Vector String
v

-- | Is taken from the @mmsyn6ukr@ package version 0.8.1.0 so that the amount of dependencies are reduced (and was slightly modified).
isUkrainianL :: Char -> Bool
isUkrainianL :: Char -> Bool
isUkrainianL Char
y | (Char
y Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'\1040' Bool -> Bool -> Bool
&& Char
y Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\1065') Bool -> Bool -> Bool
|| (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, Vector (Char, Bool)) -> Char -> Bool
forall a b. Ord a => (b, Vector (a, b)) -> a -> b
getBFst' (Bool
False, [(Char, Bool)] -> Vector (Char, Bool)
forall a. [a] -> Vector a
V.fromList ([(Char, Bool)] -> Vector (Char, Bool))
-> (String -> [(Char, Bool)]) -> String -> Vector (Char, Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> (Char, Bool)) -> String -> [(Char, Bool)]
forall a b. (a -> b) -> [a] -> [b]
map (\Char
x -> (Char
x, Bool
True)) (String -> Vector (Char, Bool)) -> String -> Vector (Char, Bool)
forall a b. (a -> b) -> a -> b
$ String
"\1028\1030\1031\1068\1100\1102\1103\1108\1110\1111\1168\1169\8217") Char
y