{-# 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 :: Int -> [Char] -> [Char]
reverseConcatenations Int
n [Char]
xs
    | [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Char]
xs = []
    | Bool
otherwise =
        [[Char]] -> [Char]
unlines ([[Char]] -> [Char]) -> ([Char] -> [[Char]]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> [Char]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([[Char]] -> [Char]
unwords ([[Char]] -> [Char]) -> ([Char] -> [[Char]]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> Bool) -> ([Char] -> [[Char]]) -> [[Char]] -> [[Char]]
forall a. (a -> Bool) -> (a -> [a]) -> [a] -> [a]
mapI (Bool -> [Char] -> Bool
forall a b. a -> b -> a
const Bool
True) (Int -> [Char] -> [[Char]]
reverseConcat1 Int
n) ([[Char]] -> [[Char]])
-> ([Char] -> [[Char]]) -> [Char] -> [[Char]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [[Char]]
words) ([[Char]] -> [[Char]])
-> ([Char] -> [[Char]]) -> [Char] -> [[Char]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [[Char]]
lines ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$
            [Char]
xs
  where
    yss :: [[Char]]
yss = [Char] -> [[Char]]
lines [Char]
xs
    zsss :: [[[Char]]]
zsss = ([Char] -> [[Char]]) -> [[Char]] -> [[[Char]]]
forall a b. (a -> b) -> [a] -> [b]
map [Char] -> [[Char]]
words [[Char]]
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 -> [Char] -> [[Char]]
reverseConcat1 Int
n [Char]
xs
    | [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Char]
xs = []
    | Bool
otherwise =
        [[Char]] -> [([Char], [[Char]])] -> [Char] -> [[Char]]
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted'
            (if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 then Int -> [Char] -> [Char] -> [Char] -> [[Char]]
reverseConcat2 Int
n [Char]
xs [Char]
ts [Char]
us else [[Char]
xs])
            [ Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1040\1073\1086" [Char]
us
            , ([Char]
"\1040\1076\1078", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1040\1076\1078\1077" [Char]
xs)
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1040\1083\1077" [Char]
us
            , ([Char]
"\1040\1085\1110", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1078" [Char]
"\1040\1085\1110\1078" [Char]
xs)
            ,
                ( [Char]
"\1041\1086\1076"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1072\1081" [Char]
"\1041\1086\1076\1072\1081" [Char]
xs
                )
            ,
                ( [Char]
"\1041\1091\1094"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word
                    Int
n
                    Int
4
                    [Char]
us
                    [Char]
"\1110\1084\1090\1086"
                    [Char]
"\1041\1091\1094\1110\1084\1090\1086"
                    [Char]
xs
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1042\1078\1077" [Char]
us
            ,
                ( [Char]
"\1042\1083\1072"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
3 [Char]
us [Char]
"\1089\1085\1077" [Char]
"\1042\1083\1072\1089\1085\1077" [Char]
xs
                )
            , ([Char]
"\1042\1090\1110", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1084" [Char]
"\1042\1090\1110\1084" [Char]
xs)
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1044\1083\1103" [Char]
us
            ,
                ( [Char]
"\1047\1072\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
3 [Char]
us [Char]
"\1072\1076\1080" [Char]
"\1047\1072\1088\1072\1076\1080" [Char]
xs
                )
            ,
                ( [Char]
"\1050\1088\1110"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1079\1100"
                    then [Char]
"\1050\1088\1110\1079\1100" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
1 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1084"
                            then [Char]
"\1050\1088\1110\1084" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
us)
                            else [[Char]
xs]
                )
            ,
                ( [Char]
"\1053\1110\1073"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1080\1090\1086"
                    then
                        [Char]
"\1053\1110\1073\1080\1090\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
1 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1080"
                            then [Char]
"\1053\1110\1073\1080" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
us)
                            else [[Char]
xs]
                )
            ,
                ( [Char]
"\1054\1082\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1110\1084" [Char]
"\1054\1082\1088\1110\1084" [Char]
xs
                )
            , ([Char]
"\1054\1090\1078", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1054\1090\1078\1077" [Char]
xs)
            , ([Char]
"\1054\1090\1086", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1078" [Char]
"\1054\1090\1086\1078" [Char]
xs)
            ,
                ( [Char]
"\1055\1088\1080"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1090\1086\1084\1091"
                    then
                        [Char]
"\1055\1088\1080\1090\1086\1084\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1090\1110\1084"
                            then [Char]
"\1055\1088\1080\1090\1110\1084" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                            else
                                if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1095\1086\1084\1091"
                                    then [Char]
"\1055\1088\1080\1095\1086\1084\1091" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                                    else
                                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1095\1110\1084"
                                            then [Char]
"\1055\1088\1080\1095\1110\1084" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                                            else [[Char]
xs]
                )
            , ([Char]
"\1057\1072\1084", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1057\1072\1084\1077" [Char]
xs)
            ,
                ( [Char]
"\1057\1077\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1086" [Char]
"\1057\1077\1073\1090\1086" [Char]
xs
                )
            , ([Char]
"\1058\1072\1082", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1080" [Char]
"\1058\1072\1082\1080" [Char]
xs)
            ,
                ( [Char]
"\1058\1086\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1086" [Char]
"\1058\1086\1073\1090\1086" [Char]
xs
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1061\1072\1081" [Char]
us
            , ([Char]
"\1061\1110\1073", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1072" [Char]
"\1061\1110\1073\1072" [Char]
xs)
            ,
                ( [Char]
"\1062\1077\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1086" [Char]
"\1062\1077\1073\1090\1086" [Char]
xs
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1065\1086\1073" [Char]
us
            , ([Char]
"\1071\1082\1073", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1080" [Char]
"\1071\1082\1073\1080" [Char]
xs)
            ,
                ( [Char]
"\1071\1082\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1072\1079" [Char]
"\1071\1082\1088\1072\1079" [Char]
xs
                )
            , ([Char]
"\1071\1082\1097", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1086" [Char]
"\1071\1082\1097\1086" [Char]
xs)
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1072\1073\1086" [Char]
us
            ,
                ( [Char]
"\1072\1076\1078"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1072\1076\1078\1077" [Char]
xs
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1072\1083\1077" [Char]
us
            , ([Char]
"\1072\1085\1110", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1078" [Char]
"\1072\1085\1110\1078" [Char]
xs)
            ,
                ( [Char]
"\1073\1086\1076"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1072\1081" [Char]
"\1073\1086\1076\1072\1081" [Char]
xs
                )
            ,
                ( [Char]
"\1073\1091\1094"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word
                    Int
n
                    Int
4
                    [Char]
us
                    [Char]
"\1110\1084\1090\1086"
                    [Char]
"\1073\1091\1094\1110\1084\1090\1086"
                    [Char]
xs
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1074\1078\1077" [Char]
us
            ,
                ( [Char]
"\1074\1080\1082"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word
                    Int
n
                    Int
5
                    [Char]
us
                    [Char]
"\1083\1102\1095\1085\1086"
                    [Char]
"\1074\1080\1082\1083\1102\1095\1085\1086"
                    [Char]
xs
                )
            ,
                ( [Char]
"\1074\1083\1072"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
3 [Char]
us [Char]
"\1089\1085\1077" [Char]
"\1074\1083\1072\1089\1085\1077" [Char]
xs
                )
            ,
                ( [Char]
"\1074\1084\1110"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
8 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1088\1091\1090\1086\1075\1086\1103\1082"
                    then
                        [Char]
"\1074"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1084\1110\1088\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1086\1075\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
11 [Char]
xs)
                    else [[Char]
xs]
                )
            , ([Char]
"\1074\1090\1110", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1084" [Char]
"\1074\1090\1110\1084" [Char]
xs)
            ,
                ( [Char]
"\1076\1072\1074"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1072\1081" [Char]
"\1076\1072\1074\1072\1081" [Char]
xs
                )
            ,
                ( [Char]
"\1076\1072\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word
                    Int
n
                    Int
4
                    [Char]
us
                    [Char]
"\1084\1072\1097\1086"
                    [Char]
"\1076\1072\1088\1084\1072\1097\1086"
                    [Char]
xs
                )
            ,
                ( [Char]
"\1076\1083\1103"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
7 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1090\1086\1075\1086\1097\1086\1073"
                    then
                        [Char]
"\1076\1083\1103"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1086\1075\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086\1073"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
7 [Char]
xs)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1079\1072\1083"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
7 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1077\1078\1085\1086\1074\1110\1076"
                    then
                        [Char]
"\1079\1072\1083\1077\1078\1085\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1074\1110\1076"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
7 [Char]
xs)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1079\1072\1084"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
11 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1110\1089\1090\1100\1090\1086\1075\1086\1097\1086\1073"
                    then
                        [Char]
"\1079\1072\1084\1110\1089\1090\1100"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1086\1075\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086\1073"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
11 [Char]
xs)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1079\1072\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
3 [Char]
us [Char]
"\1072\1076\1080" [Char]
"\1079\1072\1088\1072\1076\1080" [Char]
xs
                )
            , ([Char]
"\1079\1072\1090", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1079\1072\1090\1077" [Char]
xs)
            ,
                ( [Char]
"\1079\1090\1080"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1084\1097\1086\1073"
                    then
                        [Char]
"\1079"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1080\1084"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086\1073"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
xs)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1079\1090\1086"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
8 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1075\1086\1095\1072\1089\1091\1103\1082"
                    then
                        [Char]
"\1079"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1086\1075\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1095\1072\1089\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
8 [Char]
xs)
                    else [[Char]
xs]
                )
            , ([Char]
"\1082\1086\1083", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1080" [Char]
"\1082\1086\1083\1080" [Char]
xs)
            ,
                ( [Char]
"\1082\1088\1110"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1079\1100"
                    then [Char]
"\1082\1088\1110\1079\1100" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
1 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1084"
                            then [Char]
"\1082\1088\1110\1084" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
us)
                            else [[Char]
xs]
                )
            ,
                ( [Char]
"\1083\1077\1076"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1074\1077" [Char]
"\1083\1077\1076\1074\1077" [Char]
xs
                )
            , ([Char]
"\1083\1080\1096", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1083\1080\1096\1077" [Char]
xs)
            ,
                ( [Char]
"\1084\1072\1081"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1078\1077" [Char]
"\1084\1072\1081\1078\1077" [Char]
xs
                )
            ,
                ( [Char]
"\1084\1086\1074"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1073\1080\1090\1086"
                    then
                        [Char]
"\1084\1086\1074\1073\1080\1090\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1073\1080"
                            then [Char]
"\1084\1086\1074\1073\1080" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                            else ([Char], [[Char]]) -> [[Char]]
forall a b. (a, b) -> b
snd (Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1084\1086\1074" [Char]
us)
                )
            ,
                ( [Char]
"\1085\1072\1074"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
3 [Char]
us [Char]
"\1110\1090\1100" [Char]
"\1085\1072\1074\1110\1090\1100" [Char]
xs
                )
            ,
                ( [Char]
"\1085\1072\1089"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word
                    Int
n
                    Int
6
                    [Char]
us
                    [Char]
"\1082\1110\1083\1100\1082\1080"
                    [Char]
"\1085\1072\1089\1082\1110\1083\1100\1082\1080"
                    [Char]
xs
                )
            ,
                ( [Char]
"\1085\1072\1095"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1077\1073\1090\1086"
                    then
                        [Char]
"\1085\1072\1095\1077\1073\1090\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1077\1073"
                            then [Char]
"\1085\1072\1095\1077\1073" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                            else
                                if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
1 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1077"
                                    then [Char]
"\1085\1072\1095\1077" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
us)
                                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1085\1077\1074"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1078\1077" [Char]
"\1085\1077\1074\1078\1077" [Char]
xs
                )
            ,
                ( [Char]
"\1085\1077\1079"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
9 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1072\1083\1077\1078\1085\1086\1074\1110\1076"
                    then
                        [Char]
"\1085\1077\1079\1072\1083\1077\1078\1085\1086\1074\1110\1076"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
9 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
13 [Char]
us
                            [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"
                            then
                                [Char]
"\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"
                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
13 [Char]
us)
                            else [[Char]
xs]
                )
            ,
                ( [Char]
"\1085\1077\1084"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
6 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1086\1074\1073\1080\1090\1086"
                    then [Char]
"\1085\1077\1084\1086\1074\1073\1080\1090\1086" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
6 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1086\1074\1073\1080"
                            then
                                [Char]
"\1085\1077\1084\1086\1074\1073\1080"
                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                            else
                                if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1086\1074"
                                    then [Char]
"\1085\1077\1084\1086\1074" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1085\1077\1085"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
6 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1072\1095\1077\1073\1090\1086"
                    then [Char]
"\1085\1077\1085\1072\1095\1077\1073\1090\1086" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
6 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1072\1095\1077"
                            then
                                [Char]
"\1085\1077\1085\1072\1095\1077"
                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                            else [[Char]
xs]
                )
            ,
                ( [Char]
"\1085\1077\1093"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1072\1081" [Char]
"\1085\1077\1093\1072\1081" [Char]
xs
                )
            ,
                ( [Char]
"\1085\1110\1073"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1080\1090\1086"
                    then
                        [Char]
"\1085\1110\1073\1080\1090\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
1 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1080"
                            then [Char]
"\1085\1110\1073\1080" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
us)
                            else [[Char]
xs]
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1085\1110\1078" [Char]
us
            ,
                ( [Char]
"\1086\1082\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1110\1084" [Char]
"\1086\1082\1088\1110\1084" [Char]
xs
                )
            , ([Char]
"\1086\1090\1078", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1086\1090\1078\1077" [Char]
xs)
            , ([Char]
"\1086\1090\1086", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1078" [Char]
"\1086\1090\1086\1078" [Char]
xs)
            ,
                ( [Char]
"\1087\1086\1087"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
6 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1088\1080\1090\1077\1097\1086"
                    then
                        [Char]
"\1087\1086\1087\1088\1080"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1077"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
6 [Char]
us)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1087\1088\1080"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1090\1086\1084\1091"
                    then
                        [Char]
"\1087\1088\1080\1090\1086\1084\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1090\1110\1084"
                            then
                                [Char]
"\1087\1088\1080\1090\1110\1084"
                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                            else
                                if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
5 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1094\1100\1086\1084\1091"
                                    then
                                        [Char]
"\1087\1088\1080\1094\1100\1086\1084\1091"
                                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
5 [Char]
us)
                                    else
                                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
4 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1095\1086\1084\1091"
                                            then
                                                [Char]
"\1087\1088\1080\1095\1086\1084\1091"
                                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 [Char]
us)
                                            else
                                                if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1095\1110\1084"
                                                    then [Char]
"\1087\1088\1080\1095\1110\1084" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                                                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1087\1088\1086"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1077" [Char]
"\1087\1088\1086\1090\1077" [Char]
xs
                )
            ,
                ( [Char]
"\1087\1110\1089"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
8 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1083\1103\1090\1086\1075\1086\1103\1082"
                    then
                        [Char]
"\1087\1110\1089\1083\1103"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1086\1075\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
8 [Char]
us)
                    else [[Char]
xs]
                )
            , ([Char]
"\1089\1072\1084", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1077" [Char]
"\1089\1072\1084\1077" [Char]
xs)
            ,
                ( [Char]
"\1089\1077\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1086" [Char]
"\1089\1077\1073\1090\1086" [Char]
xs
                )
            ,
                ( [Char]
"\1090\1072\1082"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
1 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1080"
                    then [Char]
"\1090\1072\1082\1080" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
1 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1081\1072\1082"
                            then [Char]
"\1090\1072\1082" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                            else
                                if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1097\1086"
                                    then [Char]
"\1090\1072\1082" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1090\1080\1084"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
8 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1095\1072\1089\1086\1084\1081\1072\1082"
                    then
                        [Char]
"\1090\1080\1084"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1095\1072\1089\1086\1084"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
8 [Char]
us)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1090\1086\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1086" [Char]
"\1090\1086\1073\1090\1086" [Char]
xs
                )
            ,
                ( [Char]
"\1090\1086\1084"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1091\1097\1086"
                    then
                        [Char]
"\1090\1086\1084\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
3 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1091\1103\1082"
                            then
                                [Char]
"\1090\1086\1084\1091"
                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082"
                                    [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
3 [Char]
us)
                            else [[Char]
xs]
                )
            ,
                ( [Char]
"\1090\1110\1083"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
3 [Char]
us [Char]
"\1100\1082\1080" [Char]
"\1090\1110\1083\1100\1082\1080" [Char]
xs
                )
            ,
                ( [Char]
"\1091\1079\1074"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
6 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1081\1072\1079\1082\1091\1079"
                    then
                        [Char]
"\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1079\1074\x02BC\1103\1079\1082\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1079"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
6 [Char]
us)
                    else [[Char]
xs]
                )
            ,
                ( [Char]
"\1091\1084\1110"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
8 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1088\1091\1090\1086\1075\1086\1103\1082"
                    then
                        [Char]
"\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1084\1110\1088\1091"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1086\1075\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1103\1082"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
8 [Char]
us)
                    else [[Char]
xs]
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1093\1072\1081" [Char]
us
            ,
                ( [Char]
"\1093\1086\1095"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1073\1080"
                    then [Char]
"\1093\1086\1095" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1073\1080" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                    else
                        if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
2 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1072\1073"
                            then [Char]
"\1093\1086\1095\1072" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1073" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
2 [Char]
us)
                            else [Char]
"\1093\1086\1095" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [[Char]
us]
                )
            , ([Char]
"\1093\1110\1073", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1072" [Char]
"\1093\1110\1073\1072" [Char]
xs)
            ,
                ( [Char]
"\1094\1077\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1090\1086" [Char]
"\1094\1077\1073\1090\1086" [Char]
xs
                )
            ,
                ( [Char]
"\1095\1077\1088"
                , if Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
6 [Char]
us [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"\1077\1079\1090\1077\1097\1086"
                    then
                        [Char]
"\1095\1077\1088\1077\1079"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1090\1077"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char]
"\1097\1086"
                            [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [[Char]]
reverseConcat1 Int
n (Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
6 [Char]
us)
                    else [[Char]
xs]
                )
            , Int -> [Char] -> [Char] -> ([Char], [[Char]])
howConcat1WordEntirely Int
n [Char]
"\1097\1086\1073" [Char]
us
            ,
                ( [Char]
"\1103\1082\1073"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1080" [Char]
"\1103\1082\1073\1080" [Char]
xs
                )
            ,
                ( [Char]
"\1103\1082\1088"
                , Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
2 [Char]
us [Char]
"\1072\1079" [Char]
"\1103\1082\1088\1072\1079" [Char]
xs
                )
            , ([Char]
"\1103\1082\1097", Int -> Int -> [Char] -> [Char] -> [Char] -> [Char] -> [[Char]]
howConcat1Word Int
n Int
1 [Char]
us [Char]
"\1086" [Char]
"\1103\1082\1097\1086" [Char]
xs)
            ]
            [Char]
ts
  where
    ([Char]
ts, [Char]
us) = Int -> [Char] -> ([Char], [Char])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
3 [Char]
xs

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

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

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