-- |
-- Module      :  Ukrainian.ReverseConcatenations
-- Copyright   :  (c) OleksandrZhabenko 2020-2021
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Contains several functions that helps to reverse many of the phonetic languages approach concatenations
-- for the Ukrainian language.

{-# OPTIONS_GHC -threaded -rtsopts #-}

{-# LANGUAGE CPP, BangPatterns #-}

module Ukrainian.ReverseConcatenations where

#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=710
/* code that applies only to GHC 7.10.* and higher versions */
import GHC.Base (mconcat)
#endif
#endif
import Data.List (sort,isPrefixOf)
import Case.Hashable.Cuckoo (getBFstL')
import Data.List.InnToOut.Basic (mapI)
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif

{-| 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 :: Int -> String -> String
reverseConcatenations Int
n String
xs
 | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs = []
 | Bool
otherwise = [String] -> String
unlines ([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 -> Bool) -> (String -> [String]) -> [String] -> [String]
forall a. (a -> Bool) -> (a -> [a]) -> [a] -> [a]
mapI (Bool -> String -> Bool
forall a b. a -> b -> a
const Bool
True) (Int -> String -> [String]
reverseConcat1 Int
n) ([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
. String -> [String]
lines (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
xs
     where yss :: [String]
yss = String -> [String]
lines String
xs
           zsss :: [[String]]
zsss = (String -> [String]) -> [String] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map String -> [String]
words [String]
yss

{-| Reverses many phonetic languages approach related concatenations for just one Ukrainian word. Is used
internally in the 'reverseConcatenations'. -}
reverseConcat1 :: Int -> String -> [String]
reverseConcat1 :: Int -> String -> [String]
reverseConcat1 Int
n String
xs
 | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
xs = []
 | Bool
otherwise = [String] -> [(String, [String])] -> String -> [String]
forall k v. (Eq k, Hashable k) => v -> [(k, v)] -> k -> v
getBFstL' (if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 then Int -> String -> String -> String -> [String]
reverseConcat2 Int
n String
xs String
ts String
us else [String
xs]) [
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1040\1073\1086"String
us,
    (String
"\1040\1076\1078", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1040\1076\1078\1077" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1040\1083\1077" String
us,
    (String
"\1040\1085\1110", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1078" String
"\1040\1085\1110\1078" String
xs),
    (String
"\1041\1086\1076", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1081" String
"\1041\1086\1076\1072\1081" String
xs),
    (String
"\1041\1091\1094", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
4 String
us String
"\1110\1084\1090\1086" String
"\1041\1091\1094\1110\1084\1090\1086" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1042\1078\1077" String
us,
    (String
"\1042\1083\1072", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1089\1085\1077" String
"\1042\1083\1072\1089\1085\1077" String
xs),
    (String
"\1042\1090\1110", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1084" String
"\1042\1090\1110\1084" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1044\1083\1103" String
us,
    (String
"\1047\1072\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1072\1076\1080" String
"\1047\1072\1088\1072\1076\1080" String
xs),
    (String
"\1050\1088\1110", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1079\1100" then String
"\1050\1088\1110\1079\1100"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1084" then String
"\1050\1088\1110\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us) else [String
xs]),
    (String
"\1053\1110\1073", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080\1090\1086" then String
"\1053\1110\1073\1080\1090\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080" then String
"\1053\1110\1073\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us)
    else [String
xs]),
    (String
"\1054\1082\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1110\1084" String
"\1054\1082\1088\1110\1084" String
xs),
    (String
"\1054\1090\1078", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1054\1090\1078\1077" String
xs),
    (String
"\1054\1090\1086", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1078" String
"\1054\1090\1086\1078" String
xs),
    (String
"\1055\1088\1080", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1084\1091" then String
"\1055\1088\1080\1090\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us) else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1110\1084"
    then String
"\1055\1088\1080\1090\1110\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1095\1086\1084\1091"
    then String
"\1055\1088\1080\1095\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1095\1110\1084" then String
"\1055\1088\1080\1095\1110\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us)
    else [String
xs]),
    (String
"\1057\1072\1084", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1057\1072\1084\1077" String
xs),
    (String
"\1057\1077\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1086" String
"\1057\1077\1073\1090\1086" String
xs),
    (String
"\1058\1072\1082", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1080" String
"\1058\1072\1082\1080" String
xs),
    (String
"\1058\1086\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1086" String
"\1058\1086\1073\1090\1086" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1061\1072\1081" String
us,
    (String
"\1061\1110\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1072" String
"\1061\1110\1073\1072" String
xs),
    (String
"\1062\1077\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1086" String
"\1062\1077\1073\1090\1086" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1065\1086\1073" String
us,
    (String
"\1071\1082\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1080" String
"\1071\1082\1073\1080" String
xs),
    (String
"\1071\1082\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1079" String
"\1071\1082\1088\1072\1079" String
xs),
    (String
"\1071\1082\1097", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1086" String
"\1071\1082\1097\1086" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1072\1073\1086" String
us,(String
"\1072\1076\1078",
    Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1072\1076\1078\1077" String
xs),Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1072\1083\1077" String
us,
    (String
"\1072\1085\1110", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1078" String
"\1072\1085\1110\1078" String
xs),
    (String
"\1073\1086\1076",Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1081" String
"\1073\1086\1076\1072\1081" String
xs),
    (String
"\1073\1091\1094",Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
4 String
us String
"\1110\1084\1090\1086" String
"\1073\1091\1094\1110\1084\1090\1086" String
xs),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1074\1078\1077" String
us, (String
"\1074\1080\1082",
    Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
5 String
us String
"\1083\1102\1095\1085\1086" String
"\1074\1080\1082\1083\1102\1095\1085\1086" String
xs),
    (String
"\1074\1083\1072",Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1089\1085\1077" String
"\1074\1083\1072\1089\1085\1077" String
xs),
    (String
"\1074\1084\1110",if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
8 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1088\1091\1090\1086\1075\1086\1103\1082"
    then String
"\1074"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1084\1110\1088\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1086\1075\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
11 String
xs)
    else [String
xs]), (String
"\1074\1090\1110",Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1084" String
"\1074\1090\1110\1084" String
xs),
    (String
"\1076\1072\1074",Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1081" String
"\1076\1072\1074\1072\1081" String
xs),
    (String
"\1076\1072\1088",Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
4 String
us String
"\1084\1072\1097\1086" String
"\1076\1072\1088\1084\1072\1097\1086" String
xs),
    (String
"\1076\1083\1103", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
7 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1075\1086\1097\1086\1073"
    then String
"\1076\1083\1103"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1086\1075\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086\1073"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
7 String
xs)
    else [String
xs]), (String
"\1079\1072\1083", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
7 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1077\1078\1085\1086\1074\1110\1076"
    then String
"\1079\1072\1083\1077\1078\1085\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1074\1110\1076"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
7 String
xs)
    else [String
xs]), (String
"\1079\1072\1084", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
11 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1110\1089\1090\1100\1090\1086\1075\1086\1097\1086\1073"
    then String
"\1079\1072\1084\1110\1089\1090\1100"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1086\1075\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086\1073"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
11 String
xs) else [String
xs]),
    (String
"\1079\1072\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1072\1076\1080" String
"\1079\1072\1088\1072\1076\1080" String
xs),
    (String
"\1079\1072\1090", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1079\1072\1090\1077" String
xs), (String
"\1079\1090\1080",
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1084\1097\1086\1073" then String
"\1079"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1080\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086\1073"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
xs) else [String
xs]),
    (String
"\1079\1090\1086", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
8 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1075\1086\1095\1072\1089\1091\1103\1082"
    then String
"\1079"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1086\1075\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1095\1072\1089\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
8 String
xs)
    else [String
xs]), (String
"\1082\1086\1083", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1080" String
"\1082\1086\1083\1080" String
xs),
    (String
"\1082\1088\1110", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1079\1100" then String
"\1082\1088\1110\1079\1100"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1084" then String
"\1082\1088\1110\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us) else [String
xs]),
    (String
"\1083\1077\1076", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1074\1077" String
"\1083\1077\1076\1074\1077" String
xs),
    (String
"\1083\1080\1096", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1083\1080\1096\1077" String
xs),
    (String
"\1084\1072\1081", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1078\1077" String
"\1084\1072\1081\1078\1077" String
xs),
    (String
"\1084\1086\1074", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080\1090\1086" then String
"\1084\1086\1074\1073\1080\1090\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080" then String
"\1084\1086\1074\1073\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us)
    else (String, [String]) -> [String]
forall a b. (a, b) -> b
snd (Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1084\1086\1074" String
us)),
    (String
"\1085\1072\1074", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1110\1090\1100" String
"\1085\1072\1074\1110\1090\1100" String
xs),
    (String
"\1085\1072\1089", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
6 String
us String
"\1082\1110\1083\1100\1082\1080" String
"\1085\1072\1089\1082\1110\1083\1100\1082\1080" String
xs),
    (String
"\1085\1072\1095", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1077\1073\1090\1086" then String
"\1085\1072\1095\1077\1073\1090\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1077\1073" then String
"\1085\1072\1095\1077\1073"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1077"
    then String
"\1085\1072\1095\1077"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us) else [String
xs]),(String
"\1085\1077\1074",
    Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1078\1077" String
"\1085\1077\1074\1078\1077" String
xs),
    (String
"\1085\1077\1079", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
9 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1072\1083\1077\1078\1085\1086\1074\1110\1076"
    then String
"\1085\1077\1079\1072\1083\1077\1078\1085\1086\1074\1110\1076"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
9 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
13 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"
    then String
"\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
13 String
us)
    else [String
xs]),(String
"\1085\1077\1084", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
6 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1086\1074\1073\1080\1090\1086"
    then String
"\1085\1077\1084\1086\1074\1073\1080\1090\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
6 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1086\1074\1073\1080" then String
"\1085\1077\1084\1086\1074\1073\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1086\1074" then String
"\1085\1077\1084\1086\1074"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us) else [String
xs]),
    (String
"\1085\1077\1085", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
6 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1072\1095\1077\1073\1090\1086"
    then String
"\1085\1077\1085\1072\1095\1077\1073\1090\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
6 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1072\1095\1077" then String
"\1085\1077\1085\1072\1095\1077"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else [String
xs]),
    (String
"\1085\1077\1093", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1081" String
"\1085\1077\1093\1072\1081" String
xs),
    (String
"\1085\1110\1073", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080\1090\1086" then String
"\1085\1110\1073\1080\1090\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080" then String
"\1085\1110\1073\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us) else [String
xs]),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1085\1110\1078" String
us,
    (String
"\1086\1082\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1110\1084" String
"\1086\1082\1088\1110\1084" String
xs),
    (String
"\1086\1090\1078", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1086\1090\1078\1077" String
xs),
    (String
"\1086\1090\1086", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1078" String
"\1086\1090\1086\1078" String
xs),
    (String
"\1087\1086\1087", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
6 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1088\1080\1090\1077\1097\1086"
    then String
"\1087\1086\1087\1088\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1077"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
6 String
us) else [String
xs]),
    (String
"\1087\1088\1080", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1086\1084\1091" then String
"\1087\1088\1080\1090\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1090\1110\1084" then String
"\1087\1088\1080\1090\1110\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
5 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1094\1100\1086\1084\1091" then String
"\1087\1088\1080\1094\1100\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
5 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
4 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1095\1086\1084\1091" then String
"\1087\1088\1080\1095\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1095\1110\1084" then String
"\1087\1088\1080\1095\1110\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us)
    else [String
xs]),
    (String
"\1087\1088\1086", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1077" String
"\1087\1088\1086\1090\1077" String
xs),
    (String
"\1087\1110\1089", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
8 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1083\1103\1090\1086\1075\1086\1103\1082"
    then String
"\1087\1110\1089\1083\1103"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1086\1075\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
8 String
us)
    else [String
xs]), (String
"\1089\1072\1084", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1089\1072\1084\1077" String
xs),
    (String
"\1089\1077\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1086" String
"\1089\1077\1073\1090\1086" String
xs),
    (String
"\1090\1072\1082", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080" then String
"\1090\1072\1082\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1081\1072\1082" then String
"\1090\1072\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else
    if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1097\1086" then String
"\1090\1072\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us) else [String
xs]),
    (String
"\1090\1080\1084", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
8 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1095\1072\1089\1086\1084\1081\1072\1082"
    then String
"\1090\1080\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1095\1072\1089\1086\1084"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
8 String
us) else [String
xs]),
    (String
"\1090\1086\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1086" String
"\1090\1086\1073\1090\1086" String
xs),
    (String
"\1090\1086\1084", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1091\1097\1086" then String
"\1090\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us)
    else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
3 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1091\1103\1082" then String
"\1090\1086\1084\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:
    Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
3 String
us) else [String
xs]),
    (String
"\1090\1110\1083", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1100\1082\1080" String
"\1090\1110\1083\1100\1082\1080" String
xs),
    (String
"\1091\1079\1074", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
6 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1081\1072\1079\1082\1091\1079"
    then String
"\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1079\1074\x02BC\1103\1079\1082\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1079"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
6 String
us) else [String
xs]),
    (String
"\1091\1084\1110", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
8 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1088\1091\1090\1086\1075\1086\1103\1082"
    then String
"\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1084\1110\1088\1091"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1086\1075\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1103\1082"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
8 String
us)
    else [String
xs]), Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1093\1072\1081" String
us,(String
"\1093\1086\1095", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1073\1080"
    then String
"\1093\1086\1095"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1073\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us) else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1072\1073"
    then String
"\1093\1086\1095\1072"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1073"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
2 String
us) else String
"\1093\1086\1095"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String
us]),
    (String
"\1093\1110\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1072" String
"\1093\1110\1073\1072" String
xs),
    (String
"\1094\1077\1073", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1090\1086" String
"\1094\1077\1073\1090\1086" String
xs),
    (String
"\1095\1077\1088", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
6 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1077\1079\1090\1077\1097\1086"
    then String
"\1095\1077\1088\1077\1079"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1090\1077"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
"\1097\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
6 String
us) else [String
xs]),
    Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1097\1086\1073" String
us, (String
"\1103\1082\1073",
    Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1080" String
"\1103\1082\1073\1080" String
xs),
    (String
"\1103\1082\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1079" String
"\1103\1082\1088\1072\1079" String
xs),
    (String
"\1103\1082\1097", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1086" String
"\1103\1082\1097\1086" String
xs)] String
ts
      where (String
ts,String
us) = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
3 String
xs

reverseConcat2 :: Int -> String -> String -> String -> [String]
reverseConcat2 :: Int -> String -> String -> String -> [String]
reverseConcat2 Int
n String
xs String
ts String
us =
  [String] -> [(String, [String])] -> String -> [String]
forall k v. (Eq k, Hashable k) => v -> [(k, v)] -> k -> v
getBFstL' [String
xs] [(String
"\1041\1110\1083", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1103" String
"\1041\1110\1083\1103" String
xs),
  (String
"\1042\1080\1082", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
5 String
us String
"\1083\1102\1095\1085\1086" String
"\1042\1080\1082\1083\1102\1095\1085\1086" String
xs),
  (String
"\1044\1072\1074", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1081" String
"\1044\1072\1074\1072\1081" String
xs),
  (String
"\1047\1072\1090", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1047\1072\1090\1077" String
xs),
  (String
"\1050\1086\1083", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080" then String
"\1050\1086\1083\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us)
  else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1086" then String
"\1050\1086\1083\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us) else [String
xs]),
  (String
"\1051\1080\1096", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1051\1080\1096\1077" String
xs),
  Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1053\1110\1078" String
us,
  (String
"\1055\1110\1089", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1083\1103" String
"\1055\1110\1089\1083\1103" String
xs),
  (String
"\1057\1077\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1077\1076" String
"\1057\1077\1088\1077\1076" String
xs),
  (String
"\1058\1110\1083", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
3 String
us String
"\1100\1082\1080" String
"\1058\1110\1083\1100\1082\1080" String
xs),
  (String
"\1073\1110\1083", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1103" String
"\1073\1110\1083\1103" String
xs),
  (String
"\1076\1072\1074", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1072\1081" String
"\1076\1072\1074\1072\1081" String
xs),
  (String
"\1079\1072\1090", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1079\1072\1090\1077" String
xs),
  (String
"\1082\1086\1083", if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1080" then String
"\1082\1086\1083\1080"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n String
xs
  else if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"\1086" then String
"\1082\1086\1083\1086"String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
n String
xs else [String
xs]),
  (String
"\1083\1080\1096", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
1 String
us String
"\1077" String
"\1083\1080\1096\1077" String
xs),
  Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
n String
"\1085\1110\1078" String
us,
  (String
"\1087\1077\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1077\1076" String
"\1087\1077\1088\1077\1076" String
xs),
  (String
"\1087\1110\1089", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1083\1103" String
"\1087\1110\1089\1083\1103" String
xs),
  (String
"\1089\1077\1088", Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
n Int
2 String
us String
"\1077\1076" String
"\1089\1077\1088\1077\1076" String
xs)] String
ts

howConcat1Word :: Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word :: Int -> Int -> String -> String -> String -> String -> [String]
howConcat1Word Int
m Int
n String
us String
us' String
us'' String
xs
  | Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
n String
us String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
us' = String
us''String -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
m (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
n String
us)
  | Bool
otherwise = [String
xs]
{-# INLINE howConcat1Word #-}

howConcat1WordEntirely :: Int -> String -> String -> (String, [String])
howConcat1WordEntirely :: Int -> String -> String -> (String, [String])
howConcat1WordEntirely Int
m String
ts String
us = (String
ts,String
tsString -> [String] -> [String]
forall a. a -> [a] -> [a]
:Int -> String -> [String]
reverseConcat1 Int
m String
us)
{-# INLINE howConcat1WordEntirely #-}