aftovolio-0.5.0.0: Aftovolio/Ukrainian/ReverseConcatenations.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -threaded -rtsopts #-}
{-# OPTIONS_HADDOCK -show-extensions #-}
{- |
Module : Aftovolio.Ukrainian.ReverseConcatenations
Copyright : (c) OleksandrZhabenko 2020-2024
License : MIT
Stability : Experimental
Maintainer : oleksandr.zhabenko@yahoo.com
Contains several functions that helps to reverse many of the phonetic languages approach concatenations
for the Ukrainian language.
-}
module Aftovolio.Ukrainian.ReverseConcatenations where
import CaseBi.Arr (getBFstLSorted')
import Data.IntermediateStructures1 (mapI)
import Data.List
import Data.Tuple (snd)
import GHC.Base
{- | Reverses many phonetic languages approach related concatenations for the Ukrainian text. Is intended to be used
with the text on several lines.
-}
reverseConcatenations :: Int -> String -> String
reverseConcatenations n xs
| null xs = []
| otherwise =
unlines . map (unwords . mapI (const True) (reverseConcat1 n) . words) . lines $
xs
where
yss = lines xs
zsss = map words yss
{- | Reverses many phonetic languages approach related concatenations for just one Ukrainian word. Is used
internally in the 'reverseConcatenations'.
-}
reverseConcat1 :: Int -> String -> [String]
reverseConcat1 n xs
| null xs = []
| otherwise =
getBFstLSorted'
(if n == 2 then reverseConcat2 n xs ts us else [xs])
[ howConcat1WordEntirely n "\1040\1073\1086" us
, ("\1040\1076\1078", howConcat1Word n 1 us "\1077" "\1040\1076\1078\1077" xs)
, howConcat1WordEntirely n "\1040\1083\1077" us
, ("\1040\1085\1110", howConcat1Word n 1 us "\1078" "\1040\1085\1110\1078" xs)
,
( "\1041\1086\1076"
, howConcat1Word n 2 us "\1072\1081" "\1041\1086\1076\1072\1081" xs
)
,
( "\1041\1091\1094"
, howConcat1Word
n
4
us
"\1110\1084\1090\1086"
"\1041\1091\1094\1110\1084\1090\1086"
xs
)
, howConcat1WordEntirely n "\1042\1078\1077" us
,
( "\1042\1083\1072"
, howConcat1Word n 3 us "\1089\1085\1077" "\1042\1083\1072\1089\1085\1077" xs
)
, ("\1042\1090\1110", howConcat1Word n 1 us "\1084" "\1042\1090\1110\1084" xs)
, howConcat1WordEntirely n "\1044\1083\1103" us
,
( "\1047\1072\1088"
, howConcat1Word n 3 us "\1072\1076\1080" "\1047\1072\1088\1072\1076\1080" xs
)
,
( "\1050\1088\1110"
, if take 2 us == "\1079\1100"
then "\1050\1088\1110\1079\1100" : reverseConcat1 n (drop 2 us)
else
if take 1 us == "\1084"
then "\1050\1088\1110\1084" : reverseConcat1 n (drop 1 us)
else [xs]
)
,
( "\1053\1110\1073"
, if take 3 us == "\1080\1090\1086"
then
"\1053\1110\1073\1080\1090\1086"
: reverseConcat1 n (drop 3 us)
else
if take 1 us == "\1080"
then "\1053\1110\1073\1080" : reverseConcat1 n (drop 1 us)
else [xs]
)
,
( "\1054\1082\1088"
, howConcat1Word n 2 us "\1110\1084" "\1054\1082\1088\1110\1084" xs
)
, ("\1054\1090\1078", howConcat1Word n 1 us "\1077" "\1054\1090\1078\1077" xs)
, ("\1054\1090\1086", howConcat1Word n 1 us "\1078" "\1054\1090\1086\1078" xs)
,
( "\1055\1088\1080"
, if take 4 us == "\1090\1086\1084\1091"
then
"\1055\1088\1080\1090\1086\1084\1091"
: reverseConcat1 n (drop 4 us)
else
if take 3 us == "\1090\1110\1084"
then "\1055\1088\1080\1090\1110\1084" : reverseConcat1 n (drop 3 us)
else
if take 4 us == "\1095\1086\1084\1091"
then "\1055\1088\1080\1095\1086\1084\1091" : reverseConcat1 n (drop 4 us)
else
if take 3 us == "\1095\1110\1084"
then "\1055\1088\1080\1095\1110\1084" : reverseConcat1 n (drop 3 us)
else [xs]
)
, ("\1057\1072\1084", howConcat1Word n 1 us "\1077" "\1057\1072\1084\1077" xs)
,
( "\1057\1077\1073"
, howConcat1Word n 2 us "\1090\1086" "\1057\1077\1073\1090\1086" xs
)
, ("\1058\1072\1082", howConcat1Word n 1 us "\1080" "\1058\1072\1082\1080" xs)
,
( "\1058\1086\1073"
, howConcat1Word n 2 us "\1090\1086" "\1058\1086\1073\1090\1086" xs
)
, howConcat1WordEntirely n "\1061\1072\1081" us
, ("\1061\1110\1073", howConcat1Word n 1 us "\1072" "\1061\1110\1073\1072" xs)
,
( "\1062\1077\1073"
, howConcat1Word n 2 us "\1090\1086" "\1062\1077\1073\1090\1086" xs
)
, howConcat1WordEntirely n "\1065\1086\1073" us
, ("\1071\1082\1073", howConcat1Word n 1 us "\1080" "\1071\1082\1073\1080" xs)
,
( "\1071\1082\1088"
, howConcat1Word n 2 us "\1072\1079" "\1071\1082\1088\1072\1079" xs
)
, ("\1071\1082\1097", howConcat1Word n 1 us "\1086" "\1071\1082\1097\1086" xs)
, howConcat1WordEntirely n "\1072\1073\1086" us
,
( "\1072\1076\1078"
, howConcat1Word n 1 us "\1077" "\1072\1076\1078\1077" xs
)
, howConcat1WordEntirely n "\1072\1083\1077" us
, ("\1072\1085\1110", howConcat1Word n 1 us "\1078" "\1072\1085\1110\1078" xs)
,
( "\1073\1086\1076"
, howConcat1Word n 2 us "\1072\1081" "\1073\1086\1076\1072\1081" xs
)
,
( "\1073\1091\1094"
, howConcat1Word
n
4
us
"\1110\1084\1090\1086"
"\1073\1091\1094\1110\1084\1090\1086"
xs
)
, howConcat1WordEntirely n "\1074\1078\1077" us
,
( "\1074\1080\1082"
, howConcat1Word
n
5
us
"\1083\1102\1095\1085\1086"
"\1074\1080\1082\1083\1102\1095\1085\1086"
xs
)
,
( "\1074\1083\1072"
, howConcat1Word n 3 us "\1089\1085\1077" "\1074\1083\1072\1089\1085\1077" xs
)
,
( "\1074\1084\1110"
, if take 8 us == "\1088\1091\1090\1086\1075\1086\1103\1082"
then
"\1074"
: "\1084\1110\1088\1091"
: "\1090\1086\1075\1086"
: "\1103\1082"
: reverseConcat1 n (drop 11 xs)
else [xs]
)
, ("\1074\1090\1110", howConcat1Word n 1 us "\1084" "\1074\1090\1110\1084" xs)
,
( "\1076\1072\1074"
, howConcat1Word n 2 us "\1072\1081" "\1076\1072\1074\1072\1081" xs
)
,
( "\1076\1072\1088"
, howConcat1Word
n
4
us
"\1084\1072\1097\1086"
"\1076\1072\1088\1084\1072\1097\1086"
xs
)
,
( "\1076\1083\1103"
, if take 7 us == "\1090\1086\1075\1086\1097\1086\1073"
then
"\1076\1083\1103"
: "\1090\1086\1075\1086"
: "\1097\1086\1073"
: reverseConcat1 n (drop 7 xs)
else [xs]
)
,
( "\1079\1072\1083"
, if take 7 us == "\1077\1078\1085\1086\1074\1110\1076"
then
"\1079\1072\1083\1077\1078\1085\1086"
: "\1074\1110\1076"
: reverseConcat1 n (drop 7 xs)
else [xs]
)
,
( "\1079\1072\1084"
, if take 11 us == "\1110\1089\1090\1100\1090\1086\1075\1086\1097\1086\1073"
then
"\1079\1072\1084\1110\1089\1090\1100"
: "\1090\1086\1075\1086"
: "\1097\1086\1073"
: reverseConcat1 n (drop 11 xs)
else [xs]
)
,
( "\1079\1072\1088"
, howConcat1Word n 3 us "\1072\1076\1080" "\1079\1072\1088\1072\1076\1080" xs
)
, ("\1079\1072\1090", howConcat1Word n 1 us "\1077" "\1079\1072\1090\1077" xs)
,
( "\1079\1090\1080"
, if take 4 us == "\1084\1097\1086\1073"
then
"\1079"
: "\1090\1080\1084"
: "\1097\1086\1073"
: reverseConcat1 n (drop 4 xs)
else [xs]
)
,
( "\1079\1090\1086"
, if take 8 us == "\1075\1086\1095\1072\1089\1091\1103\1082"
then
"\1079"
: "\1090\1086\1075\1086"
: "\1095\1072\1089\1091"
: "\1103\1082"
: reverseConcat1 n (drop 8 xs)
else [xs]
)
, ("\1082\1086\1083", howConcat1Word n 1 us "\1080" "\1082\1086\1083\1080" xs)
,
( "\1082\1088\1110"
, if take 2 us == "\1079\1100"
then "\1082\1088\1110\1079\1100" : reverseConcat1 n (drop 2 us)
else
if take 1 us == "\1084"
then "\1082\1088\1110\1084" : reverseConcat1 n (drop 1 us)
else [xs]
)
,
( "\1083\1077\1076"
, howConcat1Word n 2 us "\1074\1077" "\1083\1077\1076\1074\1077" xs
)
, ("\1083\1080\1096", howConcat1Word n 1 us "\1077" "\1083\1080\1096\1077" xs)
,
( "\1084\1072\1081"
, howConcat1Word n 2 us "\1078\1077" "\1084\1072\1081\1078\1077" xs
)
,
( "\1084\1086\1074"
, if take 4 us == "\1073\1080\1090\1086"
then
"\1084\1086\1074\1073\1080\1090\1086"
: reverseConcat1 n (drop 4 us)
else
if take 2 us == "\1073\1080"
then "\1084\1086\1074\1073\1080" : reverseConcat1 n (drop 2 us)
else snd (howConcat1WordEntirely n "\1084\1086\1074" us)
)
,
( "\1085\1072\1074"
, howConcat1Word n 3 us "\1110\1090\1100" "\1085\1072\1074\1110\1090\1100" xs
)
,
( "\1085\1072\1089"
, howConcat1Word
n
6
us
"\1082\1110\1083\1100\1082\1080"
"\1085\1072\1089\1082\1110\1083\1100\1082\1080"
xs
)
,
( "\1085\1072\1095"
, if take 4 us == "\1077\1073\1090\1086"
then
"\1085\1072\1095\1077\1073\1090\1086"
: reverseConcat1 n (drop 4 us)
else
if take 2 us == "\1077\1073"
then "\1085\1072\1095\1077\1073" : reverseConcat1 n (drop 2 us)
else
if take 1 us == "\1077"
then "\1085\1072\1095\1077" : reverseConcat1 n (drop 1 us)
else [xs]
)
,
( "\1085\1077\1074"
, howConcat1Word n 2 us "\1078\1077" "\1085\1077\1074\1078\1077" xs
)
,
( "\1085\1077\1079"
, if take 9 us == "\1072\1083\1077\1078\1085\1086\1074\1110\1076"
then
"\1085\1077\1079\1072\1083\1077\1078\1085\1086\1074\1110\1076"
: reverseConcat1 n (drop 9 us)
else
if take 13 us
== "\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"
then
"\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"
: reverseConcat1 n (drop 13 us)
else [xs]
)
,
( "\1085\1077\1084"
, if take 6 us == "\1086\1074\1073\1080\1090\1086"
then "\1085\1077\1084\1086\1074\1073\1080\1090\1086" : reverseConcat1 n (drop 6 us)
else
if take 4 us == "\1086\1074\1073\1080"
then
"\1085\1077\1084\1086\1074\1073\1080"
: reverseConcat1 n (drop 4 us)
else
if take 2 us == "\1086\1074"
then "\1085\1077\1084\1086\1074" : reverseConcat1 n (drop 2 us)
else [xs]
)
,
( "\1085\1077\1085"
, if take 6 us == "\1072\1095\1077\1073\1090\1086"
then "\1085\1077\1085\1072\1095\1077\1073\1090\1086" : reverseConcat1 n (drop 6 us)
else
if take 3 us == "\1072\1095\1077"
then
"\1085\1077\1085\1072\1095\1077"
: reverseConcat1 n (drop 3 us)
else [xs]
)
,
( "\1085\1077\1093"
, howConcat1Word n 2 us "\1072\1081" "\1085\1077\1093\1072\1081" xs
)
,
( "\1085\1110\1073"
, if take 3 us == "\1080\1090\1086"
then
"\1085\1110\1073\1080\1090\1086"
: reverseConcat1 n (drop 3 us)
else
if take 1 us == "\1080"
then "\1085\1110\1073\1080" : reverseConcat1 n (drop 1 us)
else [xs]
)
, howConcat1WordEntirely n "\1085\1110\1078" us
,
( "\1086\1082\1088"
, howConcat1Word n 2 us "\1110\1084" "\1086\1082\1088\1110\1084" xs
)
, ("\1086\1090\1078", howConcat1Word n 1 us "\1077" "\1086\1090\1078\1077" xs)
, ("\1086\1090\1086", howConcat1Word n 1 us "\1078" "\1086\1090\1086\1078" xs)
,
( "\1087\1086\1087"
, if take 6 us == "\1088\1080\1090\1077\1097\1086"
then
"\1087\1086\1087\1088\1080"
: "\1090\1077"
: "\1097\1086"
: reverseConcat1 n (drop 6 us)
else [xs]
)
,
( "\1087\1088\1080"
, if take 4 us == "\1090\1086\1084\1091"
then
"\1087\1088\1080\1090\1086\1084\1091"
: reverseConcat1 n (drop 4 us)
else
if take 3 us == "\1090\1110\1084"
then
"\1087\1088\1080\1090\1110\1084"
: reverseConcat1 n (drop 3 us)
else
if take 5 us == "\1094\1100\1086\1084\1091"
then
"\1087\1088\1080\1094\1100\1086\1084\1091"
: reverseConcat1 n (drop 5 us)
else
if take 4 us == "\1095\1086\1084\1091"
then
"\1087\1088\1080\1095\1086\1084\1091"
: reverseConcat1 n (drop 4 us)
else
if take 3 us == "\1095\1110\1084"
then "\1087\1088\1080\1095\1110\1084" : reverseConcat1 n (drop 3 us)
else [xs]
)
,
( "\1087\1088\1086"
, howConcat1Word n 2 us "\1090\1077" "\1087\1088\1086\1090\1077" xs
)
,
( "\1087\1110\1089"
, if take 8 us == "\1083\1103\1090\1086\1075\1086\1103\1082"
then
"\1087\1110\1089\1083\1103"
: "\1090\1086\1075\1086"
: "\1103\1082"
: reverseConcat1 n (drop 8 us)
else [xs]
)
, ("\1089\1072\1084", howConcat1Word n 1 us "\1077" "\1089\1072\1084\1077" xs)
,
( "\1089\1077\1073"
, howConcat1Word n 2 us "\1090\1086" "\1089\1077\1073\1090\1086" xs
)
,
( "\1090\1072\1082"
, if take 1 us == "\1080"
then "\1090\1072\1082\1080" : reverseConcat1 n (drop 1 us)
else
if take 3 us == "\1081\1072\1082"
then "\1090\1072\1082" : "\1103\1082" : reverseConcat1 n (drop 3 us)
else
if take 2 us == "\1097\1086"
then "\1090\1072\1082" : "\1097\1086" : reverseConcat1 n (drop 2 us)
else [xs]
)
,
( "\1090\1080\1084"
, if take 8 us == "\1095\1072\1089\1086\1084\1081\1072\1082"
then
"\1090\1080\1084"
: "\1095\1072\1089\1086\1084"
: "\1103\1082"
: reverseConcat1 n (drop 8 us)
else [xs]
)
,
( "\1090\1086\1073"
, howConcat1Word n 2 us "\1090\1086" "\1090\1086\1073\1090\1086" xs
)
,
( "\1090\1086\1084"
, if take 3 us == "\1091\1097\1086"
then
"\1090\1086\1084\1091"
: "\1097\1086"
: reverseConcat1 n (drop 3 us)
else
if take 3 us == "\1091\1103\1082"
then
"\1090\1086\1084\1091"
: "\1103\1082"
: reverseConcat1 n (drop 3 us)
else [xs]
)
,
( "\1090\1110\1083"
, howConcat1Word n 3 us "\1100\1082\1080" "\1090\1110\1083\1100\1082\1080" xs
)
,
( "\1091\1079\1074"
, if take 6 us == "\1081\1072\1079\1082\1091\1079"
then
"\1091"
: "\1079\1074\x02BC\1103\1079\1082\1091"
: "\1079"
: reverseConcat1 n (drop 6 us)
else [xs]
)
,
( "\1091\1084\1110"
, if take 8 us == "\1088\1091\1090\1086\1075\1086\1103\1082"
then
"\1091"
: "\1084\1110\1088\1091"
: "\1090\1086\1075\1086"
: "\1103\1082"
: reverseConcat1 n (drop 8 us)
else [xs]
)
, howConcat1WordEntirely n "\1093\1072\1081" us
,
( "\1093\1086\1095"
, if take 2 us == "\1073\1080"
then "\1093\1086\1095" : "\1073\1080" : reverseConcat1 n (drop 2 us)
else
if take 2 us == "\1072\1073"
then "\1093\1086\1095\1072" : "\1073" : reverseConcat1 n (drop 2 us)
else "\1093\1086\1095" : [us]
)
, ("\1093\1110\1073", howConcat1Word n 1 us "\1072" "\1093\1110\1073\1072" xs)
,
( "\1094\1077\1073"
, howConcat1Word n 2 us "\1090\1086" "\1094\1077\1073\1090\1086" xs
)
,
( "\1095\1077\1088"
, if take 6 us == "\1077\1079\1090\1077\1097\1086"
then
"\1095\1077\1088\1077\1079"
: "\1090\1077"
: "\1097\1086"
: reverseConcat1 n (drop 6 us)
else [xs]
)
, howConcat1WordEntirely n "\1097\1086\1073" us
,
( "\1103\1082\1073"
, howConcat1Word n 1 us "\1080" "\1103\1082\1073\1080" xs
)
,
( "\1103\1082\1088"
, howConcat1Word n 2 us "\1072\1079" "\1103\1082\1088\1072\1079" xs
)
, ("\1103\1082\1097", howConcat1Word n 1 us "\1086" "\1103\1082\1097\1086" xs)
]
ts
where
(ts, us) = splitAt 3 xs
reverseConcat2 :: Int -> String -> String -> String -> [String]
reverseConcat2 n xs ts us =
getBFstLSorted'
[xs]
[ ("\1041\1110\1083", howConcat1Word n 1 us "\1103" "\1041\1110\1083\1103" xs)
,
( "\1042\1080\1082"
, howConcat1Word
n
5
us
"\1083\1102\1095\1085\1086"
"\1042\1080\1082\1083\1102\1095\1085\1086"
xs
)
,
( "\1044\1072\1074"
, howConcat1Word n 2 us "\1072\1081" "\1044\1072\1074\1072\1081" xs
)
, ("\1047\1072\1090", howConcat1Word n 1 us "\1077" "\1047\1072\1090\1077" xs)
,
( "\1050\1086\1083"
, if take 1 us == "\1080"
then "\1050\1086\1083\1080" : reverseConcat1 n (drop 1 us)
else
if take 1 us == "\1086"
then "\1050\1086\1083\1086" : reverseConcat1 n (drop 1 us)
else [xs]
)
, ("\1051\1080\1096", howConcat1Word n 1 us "\1077" "\1051\1080\1096\1077" xs)
, howConcat1WordEntirely n "\1053\1110\1078" us
,
( "\1055\1110\1089"
, howConcat1Word n 2 us "\1083\1103" "\1055\1110\1089\1083\1103" xs
)
,
( "\1057\1077\1088"
, howConcat1Word n 2 us "\1077\1076" "\1057\1077\1088\1077\1076" xs
)
,
( "\1058\1110\1083"
, howConcat1Word n 3 us "\1100\1082\1080" "\1058\1110\1083\1100\1082\1080" xs
)
, ("\1073\1110\1083", howConcat1Word n 1 us "\1103" "\1073\1110\1083\1103" xs)
,
( "\1076\1072\1074"
, howConcat1Word n 2 us "\1072\1081" "\1076\1072\1074\1072\1081" xs
)
, ("\1079\1072\1090", howConcat1Word n 1 us "\1077" "\1079\1072\1090\1077" xs)
,
( "\1082\1086\1083"
, if take 1 us == "\1080"
then "\1082\1086\1083\1080" : reverseConcat1 n xs
else
if take 1 us == "\1086"
then "\1082\1086\1083\1086" : reverseConcat1 n xs
else [xs]
)
, ("\1083\1080\1096", howConcat1Word n 1 us "\1077" "\1083\1080\1096\1077" xs)
, howConcat1WordEntirely n "\1085\1110\1078" us
,
( "\1087\1077\1088"
, howConcat1Word n 2 us "\1077\1076" "\1087\1077\1088\1077\1076" xs
)
,
( "\1087\1110\1089"
, howConcat1Word n 2 us "\1083\1103" "\1087\1110\1089\1083\1103" xs
)
,
( "\1089\1077\1088"
, howConcat1Word n 2 us "\1077\1076" "\1089\1077\1088\1077\1076" xs
)
]
ts
howConcat1Word :: Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word m n us us' us'' xs
| take n us == us' = us'' : reverseConcat1 m (drop n us)
| otherwise = [xs]
{-# INLINE howConcat1Word #-}
howConcat1WordEntirely :: Int -> String -> String -> (String, [String])
howConcat1WordEntirely m ts us = (ts, ts : reverseConcat1 m us)
{-# INLINE howConcat1WordEntirely #-}