module Phonetic.Languages.Ukrainian.PrepareText (
complexWords
, splitLines
, splitLinesN
, auxiliary1
, isPreposition
, isConcatenated
, isSpC
, concatenated2
, jottedConv
, prepareText
, prepareTextN
, growLinesN
, prepareGrowTextMN
, aux4
) where
import CaseBi.Arr (getBFstL')
import Data.List.InnToOut.Basic (mapI)
import Data.Char (isAlpha,toLower)
import GHC.Arr
import GHC.List (scanl1)
prepareText :: String -> [String]
prepareText :: String -> [String]
prepareText = Int -> String -> [String]
prepareTextN Int
7
{-# INLINE prepareText #-}
complexWords :: [String] -> [String]
complexWords :: [String] -> [String]
complexWords wwss :: [String]
wwss@(String
xs:String
ys:String
zs:String
ts:[String]
xss) =
[String] -> [(String, [String])] -> String -> [String]
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' (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
"\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 -> [String] -> [String]
auxiliary2Inner (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]
xss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1076\1072\1088\1084\1072", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss), (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 -> [String] -> [String]
auxiliary2Inner (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]
xss
else [String] -> [String]
auxiliary4 [String]
wwss), (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 -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs) (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else [String] -> [String]
auxiliary4 [String]
wwss
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 -> [String] -> [String]
auxiliary2Inner (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]
xss
else [String] -> [String]
auxiliary4 [String]
wwss
String
_ -> [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1079\1072\1083\1077\1078\1085\1086",
if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1074\1110\1076" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(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 -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs) (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else [String] -> [String]
auxiliary4 [String]
wwss), (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 -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs) (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else [String] -> [String]
auxiliary4 [String]
wwss),(String
"\1085\1077\1079\1072\1083\1077\1078\1085\1086",
if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1074\1110\1076" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1085\1072" then
if String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1077" Bool -> Bool -> Bool
&& String
ts String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086" then String -> [String] -> [String]
auxiliary2Inner (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]
xss
else [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(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] -> [String]
auxiliary3 [String]
wwss
else [String] -> [String]
auxiliary4 [String]
wwss), (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 -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs) (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1090\1072\1082", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1090\1072\1082", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(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] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1090\1086\1084\1091", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then String -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\1081\1072\1082") (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1091",
if (String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1079\1074'\1103\1079\1082\1091" Bool -> Bool -> Bool
|| String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1079\1074\x02BC\1103\1079\1082\1091") Bool -> Bool -> Bool
&& String
zs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1079"
then String -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\1079\1074\1081\1072\1079\1082\1091" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs) (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else String -> [String] -> [String]
auxiliary2Inner String
"\1091" (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
"\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 -> [String] -> [String]
auxiliary2Inner (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]
xss
else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1093\1086\1095", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080" then [String] -> [String]
auxiliary3 [String]
wwss
else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1093\1086\1095\1072", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073"
then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(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 -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zs) (String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss) else [String] -> [String]
auxiliary4 [String]
wwss)]) String
xs
complexWords wwss :: [String]
wwss@(String
xs:String
ys:String
zs:[String]
xss) =
[String] -> [(String, [String])] -> String -> [String]
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' (String
xsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords [String
ys,String
zs]) ([(String
"\1076\1072\1088\1084\1072", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086"
then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1079\1072\1083\1077\1078\1085\1086",
if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1074\1110\1076" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1085\1077\1079\1072\1083\1077\1078\1085\1086",
if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1074\1110\1076" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(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] -> [String]
auxiliary3 [String]
wwss
else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1090\1072\1082", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1090\1072\1082", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(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] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss),
(String
"\1090\1086\1084\1091", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1103\1082" then String -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\1081\1072\1082") (String
zsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1093\1086\1095", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080" then [String] -> [String]
auxiliary3 [String]
wwss
else [String] -> [String]
auxiliary4 [String]
wwss), (String
"\1093\1086\1095\1072", if String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073"
then [String] -> [String]
auxiliary3 [String]
wwss else [String] -> [String]
auxiliary4 [String]
wwss)]) String
xs
complexWords [String
xs,String
ys]
| String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073" Bool -> Bool -> Bool
|| String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1060" = [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys]
| String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1076\1072\1088\1084\1072" Bool -> Bool -> Bool
&& String
ys String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086" = [String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys]
| Bool
otherwise = [String
xs,String
ys]
complexWords [String]
xss = [String]
xss
auxiliary2Inner :: String -> [String] -> [String]
auxiliary2Inner :: String -> [String] -> [String]
auxiliary2Inner String
ts (String
xs:String
ys:[String]
xss)
| ([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]
forall a b. (a -> b) -> a -> b
$ [String
xs,String
ys]) [String] -> [String] -> Bool
forall a. Eq a => a -> a -> Bool
/= [String
xs,String
ys] = let ([String]
rs,[String]
ws) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 ([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]
forall a b. (a -> b) -> a -> b
$ [String
xs,String
ys]) in
(String
ts String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall a. [a] -> a
head [String]
rs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords ([[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[String]
ws,[String]
xss])
| Bool
otherwise = (String
ts String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
xs)String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String] -> [String]
complexWords (String
ysString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
xss)
auxiliary2Inner String
ts [String
xs] = [String
ts String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
xs]
auxiliary2Inner String
ts [String]
_ = [String
ts]
auxiliary3 :: [String] -> [String]
auxiliary3 :: [String] -> [String]
auxiliary3 (String
xs:String
ys:[String]
xss) = String -> [String] -> [String]
auxiliary2Inner (String
xs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ys) [String]
xss
auxiliary3 [String]
xss = [String]
xss
{-# INLINE auxiliary3 #-}
auxiliary4 :: [String] -> [String]
auxiliary4 :: [String] -> [String]
auxiliary4 (String
xs:[String]
xss) = String -> [String] -> [String]
auxiliary2Inner String
xs [String]
xss
auxiliary4 [String]
xss = [String]
xss
{-# INLINE auxiliary4 #-}
splitLines :: [String] -> [String]
splitLines :: [String] -> [String]
splitLines = Int -> [String] -> [String]
splitLinesN Int
7
{-# INLINE splitLines #-}
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
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 -> [(String, Bool)] -> String -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' Bool
False
([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] -> [(String, Bool)]) -> [Bool] -> [(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 #-}
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 -> [(String, Bool)] -> String -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' Bool
True ([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] -> [(String, Bool)]) -> [Bool] -> [(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] -> [(String, [String])] -> String -> [String]
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' (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]] -> [(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]] -> [(String, [String])])
-> [[String]] -> [(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 -> [(Char, String)] -> Char -> String
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' (String -> String
jottedConv (Char
yChar -> String -> String
forall a. a -> [a] -> [a]
:String
xs))
[(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
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
"Phonetic.Languages.Ukrainian.PrepareText.aux4: Empty String. "
| Bool
otherwise = String -> Char
forall a. [a] -> a
head String
xs
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 -> [(Char, Bool)] -> Char -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' Bool
False ((Char -> (Char, Bool)) -> String -> [(Char, Bool)]
forall a b. (a -> b) -> [a] -> [b]
map (\Char
x -> (Char
x, Bool
True)) (String -> [(Char, Bool)]) -> String -> [(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
growLinesN :: Int -> [String] -> [String]
growLinesN :: Int -> [String] -> [String]
growLinesN 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] -> String
unwords [String]
yss String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Int -> [String] -> [String]
growLinesN Int
n [String]
zss
where l :: Int
l = [Int] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Int] -> Int) -> ([String] -> [Int]) -> [String] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int) -> [Int] -> [Int]
forall a. (a -> a -> a) -> [a] -> [a]
scanl1 Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map ([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]
xss
([String]
yss,[String]
zss) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
l Int
1) [String]
xss
prepareGrowTextMN
:: Int
-> Int
-> String
-> [String]
prepareGrowTextMN :: Int -> Int -> String -> [String]
prepareGrowTextMN Int
m Int
n = Int -> [String] -> [String]
growLinesN Int
m ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> [String]
prepareTextN Int
n
{-# INLINE prepareGrowTextMN #-}