phonetic-languages-ukrainian-array 0.9.3.0 → 0.12.2.0
raw patch · 10 files changed
Files
- ChangeLog.md +20/−0
- LICENSE +1/−1
- Main.hs +42/−0
- Phladiprelio/Ukrainian/PrepareText.hs +428/−0
- Phladiprelio/Ukrainian/ReverseConcatenations.hs +218/−0
- Phonetic/Languages/Ukrainian/PrepareText.hs +0/−375
- README.md +24/−0
- Ukrainian/Main.hs +0/−42
- Ukrainian/ReverseConcatenations.hs +0/−227
- phonetic-languages-ukrainian-array.cabal +14/−13
ChangeLog.md view
@@ -79,3 +79,23 @@ * Ninth version revised C. Updated the dependencies boundaries to support the latest versions of GHC and Cabal. +## 0.10.0.0 -- 2023-02-03++* Tenth version. Switched to NoImplicitPrelude extension. Updated the metadata and dependencies boundaries.++## 0.11.0.0 -- 2023-10-01++* Eleventh version. Added new generalized functions to prepare text. Added README.md file. ++## 0.12.0.0 -- 2023-11-16++* Twelfth version. Changed the prepareTextN2 function so that also '=' is not filtered out.++## 0.12.1.0 -- 2023-11-16++* Twelfth version revised A. Downgraded the prepareTextN2 function so that it is like in the 0.11.0.0 version and introduced the function prepareTextN3 with '=' is being not filtered out.++## 0.12.2.0 -- 2024-02-22++* Twelfth version revised B. Changed dependency to intermediate-structures instead of mmsyn5. Added Git repository with bug-tracker. Some changes in README.md. +
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2020-2022 OleksandrZhabenko+Copyright (c) 2020-2024 Oleksandr Zhabenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
+ Main.hs view
@@ -0,0 +1,42 @@+-- |+-- Module : Main+-- Copyright : (c) OleksandrZhabenko 2021-2024+-- License : MIT+-- Stability : Experimental+-- Maintainer : oleksandr.zhabenko@yahoo.com+--+--++{-# OPTIONS_GHC -threaded -rtsopts #-}+{-# OPTIONS_HADDOCK -show-extensions #-}+{-# LANGUAGE NoImplicitPrelude #-}++{-# LANGUAGE BangPatterns #-}++module Main where++import GHC.Base+import Phladiprelio.Ukrainian.ReverseConcatenations+import System.Environment (getArgs)+import Text.Read (readMaybe)+import Data.Maybe (fromMaybe)+import System.IO+import GHC.List+++main :: IO ()+main = do+ args0 <- getArgs+ let !fstA = fromMaybe 1 (readMaybe (mconcat . take 1 $ args0)::Maybe Int)+ !args+ | fstA == 1 = filter (/= "-i") args0+ | otherwise = filter (/= "-i") . drop 1 $ args0+ !stdinput = any (== "-i") args0 -- If you specify \"-i\" then reads the input text from the stdin otherwise from the file specified instead.+ if stdinput then do+ contents <- getContents+ putStrLn . reverseConcatenations fstA $ contents+ else do+ let !file = concat . take 1 $ args+ !toFile = concat . drop 1 . take 2 $ args+ if null file then putStrLn "No file to read the Ukrainian text is specified. "+ else readFile file >>= return . reverseConcatenations fstA >>= (\ts -> if null toFile then putStrLn ts else writeFile toFile ts)
+ Phladiprelio/Ukrainian/PrepareText.hs view
@@ -0,0 +1,428 @@+-- |+-- Module : Phladiprelio.Ukrainian.PrepareText+-- Copyright : (c) OleksandrZhabenko 2020-2024+-- License : MIT+-- Stability : Experimental+-- Maintainer : oleksandr.zhabenko@yahoo.com+--+-- Earlier it has been a module DobutokO.Poetry.Ukrainian.PrepareText+-- from the @dobutokO-poetry@ package.+-- In particular, this module can be used to prepare the Ukrainian text+-- by applying the most needed grammar for PhLADiPreLiO to avoid misunderstanding+-- for the produced text. The attention is paid to the prepositions, pronouns, conjunctions+-- and particles that are most commonly connected (or not) in a significant way+-- with the next text.+-- Uses the information from:+-- https://uk.wikipedia.org/wiki/%D0%A1%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%BD%D0%B8%D0%BA+-- and+-- https://uk.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BA%D0%B0_(%D0%BC%D0%BE%D0%B2%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%BE)+--+-- Uses arrays instead of vectors.++{-# OPTIONS_HADDOCK -show-extensions #-}+{-# LANGUAGE NoImplicitPrelude #-}++module Phladiprelio.Ukrainian.PrepareText (+ -- * Basic functions+ complexWords+ , participleConc+ , splitLines+ , splitLinesN+ , auxiliary1+ , isPreposition+ , isParticipleAppended+ , isPrepended+ , isConcatenated+ , isSpC+ , isUkrainianL+ , concatenated2+ , jottedConv+ , jottedCnv+ -- * The end-user functions+ , prepareText+ , prepareTextN+ , prepareTextN2+ , prepareTextN3+ , prepareTextNG+ , growLinesN+ , prepareGrowTextMN+ , prepareGrowTextMNG+ , tuneLinesN+ , prepareTuneTextMN+ , prepareTuneTextMNG+ -- * Used to transform after convertToProperUkrainian from mmsyn6ukr package+ , aux4+) where++import Data.Bits (shiftR)+import GHC.Base+import Data.List+import CaseBi.Arr (getBFstLSorted')+import Data.IntermediateStructures1 (mapI)+import Data.Char (isAlpha,toLower,isDigit)+import GHC.Arr+import GHC.Num ((+))++-- | Is used to convert a Ukrainian text into list of 'String' each of which is ready to be+-- used by the functions of the modules for the phonetic languages approach.+-- It applies minimal grammar links and connections between the most commonly used Ukrainian+-- words that \"should\" be paired and not dealt with separately+-- to avoid the misinterpretation and preserve maximum of the semantics for the+-- \"phonetic\" language on the Ukrainian basis.+prepareText :: String -> [String]+prepareText = prepareTextN 7+{-# INLINE prepareText #-}++-- | Concatenates complex words in Ukrainian so that they are not separated further by possible words order rearrangements (because they are treated+-- as a single word). This is needed to preserve basic grammar in phonetic languages.+complexWords :: [String] -> [String]+complexWords wwss@(xs:ys:zs:ts:xss) =+ getBFstLSorted' (xs:complexWords (ys:zs:ts:xss)) ([("\1074",+ if ys == "\1084\1110\1088\1091" && zs == "\1090\1086\1075\1086" &&+ ts == "\1103\1082" then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss else auxiliary4 wwss),+ ("\1076\1072\1088\1084\1072", if ys == "\1097\1086"+ then auxiliary3 wwss else auxiliary4 wwss), ("\1076\1083\1103",+ if ys == "\1090\1086\1075\1086" && zs == "\1097\1086\1073"+ then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss+ else auxiliary4 wwss), ("\1079",+ case ys of+ "\1090\1080\1084" -> if zs == "\1097\1086\1073"+ then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)+ else auxiliary4 wwss+ "\1090\1086\1075\1086" -> if zs == "\1095\1072\1089\1091" && ts == "\1103\1082"+ then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` "\1081\1072\1082") xss+ else auxiliary4 wwss+ _ -> auxiliary4 wwss), ("\1079\1072\1083\1077\1078\1085\1086",+ if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),+ ("\1079\1072\1084\1110\1089\1090\1100",+ if ys == "\1090\1086\1075\1086" && zs == "\1097\1086\1073"+ then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)+ else auxiliary4 wwss), ("\1087\1086\1087\1088\1080",+ if ys == "\1090\1077" && zs == "\1097\1086" then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)+ else auxiliary4 wwss),("\1085\1077\1079\1072\1083\1077\1078\1085\1086",+ if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),+ ("\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080", if ys == "\1085\1072" then+ if zs == "\1090\1077" && ts == "\1097\1086" then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss+ else auxiliary3 wwss else auxiliary4 wwss),+ ("\1087\1088\1080",+ if ys == "\1094\1100\1086\1084\1091" then auxiliary3 wwss+ else auxiliary4 wwss), ("\1087\1110\1089\1083\1103",+ if ys == "\1090\1086\1075\1086" && zs == "\1103\1082" then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)+ else auxiliary4 wwss), ("\1090\1072\1082", if (ys == "\1097\1086") || (ys == "\1103\1082")+ then auxiliary3 wwss else auxiliary4 wwss),+ ("\1090\1080\1084\1095\1072\1089\1086\1084", if ys == "\1103\1082"+ then auxiliary3 wwss else auxiliary4 wwss),+ ("\1090\1086\1084\1091", if ys == "\1103\1082" then auxiliary2Inner (xs `mappend` "\1081\1072\1082") (zs:ts:xss)+ else auxiliary4 wwss), ("\1091",+ if (ys == "\1079\1074'\1103\1079\1082\1091" || ys == "\1079\1074\x02BC\1103\1079\1082\1091") && zs == "\1079"+ then auxiliary2Inner (xs `mappend` "\1079\1074\1081\1072\1079\1082\1091" `mappend` zs) (ts:xss)+ else if ys == "\1084\1110\1088\1091" && zs == "\1090\1086\1075\1086" && ts == "\1103\1082"+ then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss else auxiliary4 wwss),+ ("\1093\1086\1095", if ys == "\1073\1080" then auxiliary3 wwss+ else auxiliary4 wwss), ("\1093\1086\1095\1072", if ys == "\1073"+ then auxiliary3 wwss else auxiliary4 wwss),+ ("\1095\1077\1088\1077\1079", if ys == "\1090\1077" && zs == "\1097\1086"+ then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss) else auxiliary4 wwss)]) xs+complexWords wwss@(xs:ys:zs:xss) =+ getBFstLSorted' (xs:complexWords [ys,zs]) ([("\1076\1072\1088\1084\1072", if ys == "\1097\1086"+ then auxiliary3 wwss else auxiliary4 wwss), ("\1079\1072\1083\1077\1078\1085\1086",+ if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),+ ("\1085\1077\1079\1072\1083\1077\1078\1085\1086",+ if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),+ ("\1087\1088\1080",+ if ys == "\1094\1100\1086\1084\1091" then auxiliary3 wwss+ else auxiliary4 wwss), ("\1090\1072\1082", if ys == "\1097\1086" || ys == "\1103\1082"+ then auxiliary3 wwss else auxiliary4 wwss),+ ("\1090\1080\1084\1095\1072\1089\1086\1084", if ys == "\1103\1082"+ then auxiliary3 wwss else auxiliary4 wwss),+ ("\1090\1086\1084\1091", if ys == "\1103\1082" then auxiliary2Inner (xs `mappend` "\1081\1072\1082") (zs:xss)+ else auxiliary4 wwss), ("\1093\1086\1095", if ys == "\1073\1080" then auxiliary3 wwss+ else auxiliary4 wwss), ("\1093\1086\1095\1072", if ys == "\1073"+ then auxiliary3 wwss else auxiliary4 wwss)]) xs+complexWords [xs,ys]+ | ys `elem` ["\1073","\1073\1060","\1078\1077","\1078"] = [xs `mappend` ys]+ | xs == "\1076\1072\1088\1084\1072" && ys == "\1097\1086" = [xs `mappend` ys]+ | otherwise = [xs,ys]+complexWords xss = xss++auxiliary2Inner :: String -> [String] -> [String]+auxiliary2Inner ts (xs:ys:xss)+ | (concatenated2 . auxiliary1 $ [xs,ys]) /= [xs,ys] = let (rs,ws) = splitAt 1 (concatenated2 . auxiliary1 $ [xs,ys]) in+ (ts `mappend` head rs):complexWords (concat [ws,xss])+ | otherwise = (ts `mappend` xs):complexWords (ys:xss)+auxiliary2Inner ts [xs] = [ts `mappend` xs]+auxiliary2Inner ts _ = [ts]++auxiliary3 :: [String] -> [String]+auxiliary3 (xs:ys:xss) = auxiliary2Inner (xs `mappend` ys) xss+auxiliary3 xss = xss+{-# INLINE auxiliary3 #-}++auxiliary4 :: [String] -> [String]+auxiliary4 (xs:xss) = auxiliary2Inner xs xss+auxiliary4 xss = xss+{-# INLINE auxiliary4 #-}++-- | Since 0.2.1.0 version the function is recursive and is applied so that all returned elements ('String') are no longer than 7 words in them.+splitLines :: [String] -> [String]+splitLines = splitLinesN 7+{-# INLINE splitLines #-}++-- | A generalized variant of the 'splitLines' with the arbitrary maximum number of the words in the lines given as the first argument.+splitLinesN :: Int -> [String] -> [String]+splitLinesN n xss+ | null xss || n <= 0 = []+ | otherwise = mapI (\xs -> compare (length . words $ xs) n == GT) (\xs -> let yss = words xs in+ splitLines . map unwords . (\(q,r) -> [q,r]) . splitAt (shiftR (length yss) 1) $ yss) $ xss++-- | A generalized variant of the 'prepareText' with the arbitrary maximum number of the words in the lines given as the first argument.+prepareTextN :: Int -> String -> [String]+prepareTextN = prepareTextNG (\t -> isAlpha t || isSpC t) +{-# INLINE prepareTextN #-}++-- | A generalized variant of the 'prepareText' with the arbitrary maximum number of the words in the lines given as the first argument. The \'_\' is not filtered out.+prepareTextN2 :: Int -> String -> [String]+prepareTextN2 = prepareTextNG (\t -> isAlpha t || isSpC t || t == '_' || isDigit t) +{-# INLINE prepareTextN2 #-}++-- | A generalized variant of the 'prepareText' with the arbitrary maximum number of the words in the lines given as the first argument. Both \'_\' and \'=\' are not filtered out.+prepareTextN3 :: Int -> String -> [String]+prepareTextN3 = prepareTextNG (\t -> isAlpha t || isSpC t || t == '_' || t == '=' || isDigit t) +{-# INLINE prepareTextN3 #-}++-- | An even more generalized variant of the 'prepareTextN' with the arbitrary maximum number of the words in the lines given as the second argument and the possibility to provide custom function for filtering.+prepareTextNG + :: (Char -> Bool) -- ^ A predicate to filter the symbols during preparation.+ -> Int + -> String + -> [String]+prepareTextNG f n = filter (any isUkrainianL) . splitLinesN n .+ map (unwords . concatenated2 . participleConc . auxiliary1 . complexWords . words . filter f) .+ filter (not . null) . lines+{-# INLINE prepareTextNG #-}++participleConc :: [String] -> [String]+participleConc (xs:ys:zs:yss)+ | isParticipleAppended ys = if isParticipleAppended zs then (xs `mappend` ys `mappend` zs):participleConc yss+ else participleConc (xs `mappend` ys:zs:yss)+ | otherwise = xs:participleConc (ys:zs:yss)+participleConc (xs:ys:yss)+ | isParticipleAppended ys = (xs `mappend` ys):participleConc yss+ | otherwise = xs:participleConc (ys:yss)+participleConc yss = yss++isParticipleAppended :: String -> Bool+isParticipleAppended xs = xs `elem` ["\1073","\1073\1080","\1078\1077","\1078"]++isPrepended :: String -> Bool+isPrepended xs+ | isParticipleAppended xs = True+ | isPreposition xs = True+ | otherwise = isConcatenated xs++jottedCnv :: String -> String+jottedCnv xs = drop 1 . jottedConv $ ' ':xs++auxiliary1 :: [String] -> [String]+auxiliary1 yss@(xs:zs:xss)+ | isParticipleAppended xs = xs:auxiliary1 (zs:xss)+ | isPreposition xs || isConcatenated xs = auxiliary1 (concatMap jottedCnv (tss `mappend` wss):vss)+ | otherwise = xs:auxiliary1 (zs:xss)+ where (tss,uss) = span isPrepended yss+ (wss,vss) = splitAt 1 uss+auxiliary1 xss = xss++isPreposition :: String -> Bool+isPreposition ts =+ getBFstLSorted' False+ (zip ["\1030\1079", "\1041\1077\1079", "\1041\1110\1083\1103", "\1042",+ "\1042\1110\1076", "\1044\1083\1103", "\1044\1086", "\1047",+ "\1047\1072", "\1047\1072\1088\1072\1076\1080", "\1047\1110",+ "\1050", "\1050\1086\1083\1086", "\1050\1088\1110\1079\1100",+ "\1050\1088\1110\1084", "\1052\1077\1078", "\1052\1077\1078\1080",+ "\1052\1110\1078", "\1053\1072", "\1053\1072\1076", "\1054",+ "\1054\1073", "\1054\1076", "\1054\1082\1088\1110\1084",+ "\1055\1077\1088\1077\1076", "\1055\1086", "\1055\1088\1080",+ "\1055\1088\1086", "\1055\1088\1086\1090\1080",+ "\1055\1110\1076", "\1055\1110\1089\1083\1103",+ "\1057\1077\1088\1077\1076", "\1057\1077\1088\1077\1076\1080",+ "\1059", "\1063\1077\1088\1077\1079", "\1073\1077\1079",+ "\1073\1110\1083\1103", "\1074", "\1074\1110\1076",+ "\1076\1083\1103", "\1076\1086", "\1079", "\1079\1072",+ "\1079\1072\1088\1072\1076\1080", "\1079\1110",+ "\1082", "\1082\1086\1083\1086", "\1082\1088\1110\1079\1100",+ "\1082\1088\1110\1084", "\1084\1077\1078", "\1084\1077\1078\1080",+ "\1084\1110\1078", "\1085\1072", "\1085\1072\1076", "\1086",+ "\1086\1073", "\1086\1076", "\1086\1082\1088\1110\1084",+ "\1087\1077\1088\1077\1076", "\1087\1086", "\1087\1088\1080",+ "\1087\1088\1086", "\1087\1088\1086\1090\1080", "\1087\1110\1076",+ "\1087\1110\1089\1083\1103", "\1089\1077\1088\1077\1076",+ "\1089\1077\1088\1077\1076\1080", "\1091",+ "\1095\1077\1088\1077\1079", "\1110\1079"] $+ replicate 200 True) ts+{-# INLINE isPreposition #-}++-- | Since the dobutokO-poetry version 0.16.3.0 the (||) operator has been changed to the (&&).+-- The idea is that these words are the ones that are pronouns and they \"should\" be treated+-- (by the author's understanding) as independent words.+isConcatenated :: String -> Bool+isConcatenated ts+ | null ts = False+ | otherwise = compare (length ts) 2 /= GT &&+ getBFstLSorted' True (zip ["\1028", "\1042\1080", "\1052\1080", "\1058\1080", "\1058\1110",+ "\1062\1110", "\1071", "\1074\1080", "\1084\1080", "\1090\1080", "\1090\1110",+ "\1094\1110", "\1103", "\1108"] $ replicate 14 False) ts && (head ts `notElem` "\1031\1111")+{-# INLINE isConcatenated #-}++concatenated2 :: [String] -> [String]+concatenated2 (xs:ys:xss) =+ getBFstLSorted' (xs:concatenated2 (ys:xss)) (zip ["\1040\1073\1086","\1040\1076\1078\1077",+ "\1040\1083\1077","\1040\1085\1110\1078","\1041\1086\1076\1072\1081",+ "\1041\1091\1094\1110\1084\1090\1086","\1042\1078\1077","\1042\1080\1082\1083\1102\1095\1085\1086",+ "\1042\1083\1072\1089\1085\1077","\1042\1090\1110\1084","\1044\1072\1074\1072\1081",+ "\1047\1072\1090\1077","\1050\1086\1083\1080","\1051\1077\1076\1074\1077","\1051\1080\1096\1077",+ "\1052\1072\1081\1078\1077","\1052\1086\1074","\1052\1086\1074\1073\1080",+ "\1052\1086\1074\1073\1080\1090\1086","\1053\1072\1074\1110\1090\1100",+ "\1053\1072\1089\1082\1110\1083\1100\1082\1080","\1053\1072\1095\1077","\1053\1072\1095\1077\1073",+ "\1053\1072\1095\1077\1073\1090\1086","\1053\1077\1074\1078\1077","\1053\1077\1084\1086\1074",+ "\1053\1077\1084\1086\1074\1073\1080","\1053\1077\1084\1086\1074\1073\1080\1090\1086",+ "\1053\1077\1085\1072\1095\1077","\1053\1077\1085\1072\1095\1077\1073\1090\1086",+ "\1053\1077\1093\1072\1081","\1053\1090\1078\1077","\1053\1110\1073\1080",+ "\1053\1110\1073\1080\1090\1086","\1053\1110\1078","\1054\1090\1086\1078",+ "\1055\1088\1080\1090\1086\1084\1091","\1055\1088\1080\1090\1110\1084",+ "\1055\1088\1080\1095\1086\1084\1091","\1055\1088\1080\1095\1110\1084",+ "\1055\1088\1086\1090\1077","\1057\1072\1084\1077","\1057\1077\1073\1090\1086",+ "\1058\1072\1082\1080","\1058\1086\1073\1090\1086","\1058\1110\1083\1100\1082\1080",+ "\1061\1072\1081","\1061\1086\1095","\1061\1110\1073\1072","\1062\1077\1073\1090\1086",+ "\1065\1086\1073","\1071\1082\1073\1080","\1071\1082\1088\1072\1079","\1071\1082\1097\1086",+ "\1072\1073\1086","\1072\1076\1078\1077","\1072\1083\1077","\1072\1085\1110\1078",+ "\1073\1086\1076\1072\1081","\1073\1091\1094\1110\1084\1090\1086","\1074\1078\1077",+ "\1074\1080\1082\1083\1102\1095\1085\1086","\1074\1083\1072\1089\1085\1077",+ "\1074\1090\1110\1084","\1076\1072\1074\1072\1081","\1079\1072\1090\1077","\1082\1086\1083\1080",+ "\1083\1077\1076\1074\1077","\1083\1080\1096\1077","\1084\1072\1081\1078\1077","\1084\1086\1074",+ "\1084\1086\1074\1073\1080","\1084\1086\1074\1073\1080\1090\1086","\1085\1072\1074\1110\1090\1100",+ "\1085\1072\1089\1082\1110\1083\1100\1082\1080","\1085\1072\1095\1077","\1085\1072\1095\1077\1073",+ "\1085\1072\1095\1077\1073\1090\1086","\1085\1077\1074\1078\1077","\1085\1077\1084\1086\1074",+ "\1085\1077\1084\1086\1074\1073\1080","\1085\1077\1084\1086\1074\1073\1080\1090\1086",+ "\1085\1077\1085\1072\1095\1077","\1085\1077\1085\1072\1095\1077\1073\1090\1086",+ "\1085\1077\1093\1072\1081","\1085\1110\1073\1080","\1085\1110\1073\1080\1090\1086",+ "\1085\1110\1078","\1086\1090\1078\1077","\1086\1090\1086\1078","\1087\1088\1080\1090\1086\1084\1091",+ "\1087\1088\1080\1090\1110\1084","\1087\1088\1080\1095\1086\1084\1091","\1087\1088\1080\1095\1110\1084",+ "\1087\1088\1086\1090\1077","\1089\1072\1084\1077","\1089\1077\1073\1090\1086","\1090\1072\1082\1080",+ "\1090\1086\1073\1090\1086","\1090\1110\1083\1100\1082\1080","\1093\1072\1081","\1093\1086\1095",+ "\1093\1110\1073\1072","\1094\1077\1073\1090\1086","\1097\1086\1073","\1103\1082\1073\1080",+ "\1103\1082\1088\1072\1079","\1103\1082\1097\1086"] $ replicate 200 ((xs `mappend` jottedCnv ys):concatenated2 xss)) xs+concatenated2 xss = xss++isSpC :: Char -> Bool+isSpC x = x == '\'' || x == ' ' || x == '\x2019' || x == '\x02BC' || x == '-'+{-# INLINE isSpC #-}++jottedConv :: String -> String+jottedConv (x:y:xs)+ | isSpC x = x:(getBFstLSorted' (jottedConv (y:xs))+ [('\1028', '\1049':'\1077':jottedConv xs),+ ('\1031', '\1049':'\1110':jottedConv xs),+ ('\1070', '\1049':'\1091':jottedConv xs),+ ('\1071', '\1049':'\1072':jottedConv xs),+ ('\1102', '\1081':'\1091':jottedConv xs),+ ('\1103', '\1081':'\1072':jottedConv xs),+ ('\1108', '\1081':'\1077':jottedConv xs),+ ('\1111', '\1081':'\1110':jottedConv xs)] y)+ | otherwise = x:jottedConv (y:xs)+jottedConv xs = xs++-- | Can be used to prepare the text after 'convertToProperUkrainian' from 'Melodics.Ukrainian' module from @mmsyn6ukr@ package so that all the 'String' can+-- be represented as unique 'Char'.+aux4 :: String -> Char+aux4 xs+ | xs == "\1076\1078" = 'j'+ | xs == "\1076\1079" = 'z'+ | xs == "\1089\1100" = 's'+ | xs == "\1094\1100" = 'c'+ | null xs = error "Phladiprelio.Ukrainian.PrepareText.aux4: Empty String. "+ | otherwise = head xs++-- | Is taken from the @mmsyn6ukr@ package version 0.8.1.0 so that the amount of dependencies are reduced (and was slightly modified).+isUkrainianL :: Char -> Bool+isUkrainianL y | (y >= '\1040' && y <= '\1065') || (y >= '\1070' && y <= '\1097') = True+ | otherwise = getBFstLSorted' False (map (\x -> (x, True)) $ "\1028\1030\1031\1068\1100\1102\1103\1108\1110\1111\1168\1169\8217") y++-------------------------------------++{-| @ since 0.2.0.0+Given a positive number and a list tries to rearrange the list's 'String's by concatenation of the several elements of the list+so that the number of words in every new 'String' in the resulting list is not greater than the 'Int' argument. If some of the+'String's have more than that number quantity of the words then these 'String's are preserved.+-}+growLinesN :: Int -> [String] -> [String]+growLinesN n xss+ | null xss || n < 0 = []+ | otherwise = unwords yss : growLinesN n zss+ where l = length . takeWhile (<= n) . scanl1 (+) . map (length . words) $ xss -- the maximum number of lines to be taken+ (yss,zss) = splitAt (max l 1) xss++{-| @ since 0.2.0.0+The function combines the 'prepareTextN' and 'growLinesN' function. Applies needed phonetic language preparations+to the Ukrainian text and tries to \'grow\' the resulting 'String's in the list so that the number of the words in every+of them is no greater than the given first 'Int' number.+-}+prepareGrowTextMN+ :: Int -- ^ A maximum number of the words or their concatenations in the resulting list of 'String's.+ -> Int -- ^ A number of words in every 'String' that the function firstly forms. To have some sense of usage, must be less than the first argument.+ -> String+ -> [String]+prepareGrowTextMN m n = growLinesN m . prepareTextN n+{-# INLINE prepareGrowTextMN #-}++{-| @ since 0.11.0.0+The generalized version of the 'prepareGrowTextMN' with additional possibility to provide custom function for symbols filtering inside.+-}+prepareGrowTextMNG+ :: (Char -> Bool) -- ^ A predicate to filter the symbols during preparation.+ -> Int -- ^ A maximum number of the words or their concatenations in the resulting list of 'String's.+ -> Int -- ^ A number of words in every 'String' that the function firstly forms. To have some sense of usage, must be less than the first argument.+ -> String+ -> [String]+prepareGrowTextMNG f m n = growLinesN m . prepareTextNG f n+{-# INLINE prepareGrowTextMNG #-}++-------------------------------------++{-| @ since 0.6.0.0+Recursively splits the concatenated list of lines of words so that in every resulting 'String' in the list+except the last one there is just 'Int' -- the first argument -- words.+-}+tuneLinesN :: Int -> [String] -> [String]+tuneLinesN n xss+ | null xss || n < 0 = []+ | otherwise =+ let wss = words . unwords $ xss+ (yss,zss) = splitAt n wss+ in unwords yss : tuneLinesN n zss++{-| @ since 0.6.0.0+The function combines the 'prepareTextN' and 'tuneLinesN' functions. Applies needed phonetic language preparations+to the Ukrainian text and splits the list of 'String's so that the number of the words in each of them (except the last one)+is equal the given first 'Int' number.+-}+prepareTuneTextMN+ :: Int -- ^ A number of the words or their concatenations in the resulting list of 'String's (except probably the last one).+ -> Int -- ^ A number of words in every 'String' that the function firstly forms. To have some sense of usage, must be less than the first argument.+ -> String+ -> [String]+prepareTuneTextMN m n = tuneLinesN m . prepareTextN n+{-# INLINE prepareTuneTextMN #-}++{-| @ since 0.11.0.0+The generalized version of the 'prepareTuneTextMN' with additional possibility to provide custom function for symbols filtering inside.+-}+prepareTuneTextMNG+ :: (Char -> Bool) -- ^ A predicate to filter the symbols during preparation.+ -> Int -- ^ A number of the words or their concatenations in the resulting list of 'String's (except probably the last one).+ -> Int -- ^ A number of words in every 'String' that the function firstly forms. To have some sense of usage, must be less than the first argument.+ -> String+ -> [String]+prepareTuneTextMNG f m n = tuneLinesN m . prepareTextNG f n+{-# INLINE prepareTuneTextMNG #-}+
+ Phladiprelio/Ukrainian/ReverseConcatenations.hs view
@@ -0,0 +1,218 @@+-- |+-- Module : Phladiprelio.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.++{-# OPTIONS_GHC -threaded -rtsopts #-}++{-# OPTIONS_HADDOCK -show-extensions #-}+{-# LANGUAGE BangPatterns, NoImplicitPrelude #-}++module Phladiprelio.Ukrainian.ReverseConcatenations where++import Data.Tuple (snd)+import GHC.Base+import Data.List +import CaseBi.Arr (getBFstLSorted')+import Data.IntermediateStructures1 (mapI)++{-| Reverses many phonetic languages approach related concatenations for the Ukrainian text. Is intended to be used+with the text on several lines. -}+reverseConcatenations :: Int -> String -> String+reverseConcatenations n xs+ | null xs = []+ | otherwise = unlines . map (unwords . mapI (const True) (reverseConcat1 n) . words) . lines $ xs+ where yss = lines xs+ zsss = map words yss++{-| Reverses many phonetic languages approach related concatenations for just one Ukrainian word. Is used+internally in the 'reverseConcatenations'. -}+reverseConcat1 :: Int -> String -> [String]+reverseConcat1 n xs+ | null xs = []+ | otherwise = getBFstLSorted' (if n == 2 then reverseConcat2 n xs ts us else [xs]) [+ howConcat1WordEntirely n "\1040\1073\1086"us,+ ("\1040\1076\1078", howConcat1Word n 1 us "\1077" "\1040\1076\1078\1077" xs),+ howConcat1WordEntirely n "\1040\1083\1077" us,+ ("\1040\1085\1110", howConcat1Word n 1 us "\1078" "\1040\1085\1110\1078" xs),+ ("\1041\1086\1076", howConcat1Word n 2 us "\1072\1081" "\1041\1086\1076\1072\1081" xs),+ ("\1041\1091\1094", howConcat1Word n 4 us "\1110\1084\1090\1086" "\1041\1091\1094\1110\1084\1090\1086" xs),+ howConcat1WordEntirely n "\1042\1078\1077" us,+ ("\1042\1083\1072", howConcat1Word n 3 us "\1089\1085\1077" "\1042\1083\1072\1089\1085\1077" xs),+ ("\1042\1090\1110", howConcat1Word n 1 us "\1084" "\1042\1090\1110\1084" xs),+ howConcat1WordEntirely n "\1044\1083\1103" us,+ ("\1047\1072\1088", howConcat1Word n 3 us "\1072\1076\1080" "\1047\1072\1088\1072\1076\1080" xs),+ ("\1050\1088\1110", if take 2 us == "\1079\1100" then "\1050\1088\1110\1079\1100":reverseConcat1 n (drop 2 us)+ else if take 1 us == "\1084" then "\1050\1088\1110\1084":reverseConcat1 n (drop 1 us) else [xs]),+ ("\1053\1110\1073", if take 3 us == "\1080\1090\1086" then "\1053\1110\1073\1080\1090\1086":+ reverseConcat1 n (drop 3 us) else if take 1 us == "\1080" then "\1053\1110\1073\1080":reverseConcat1 n (drop 1 us)+ else [xs]),+ ("\1054\1082\1088", howConcat1Word n 2 us "\1110\1084" "\1054\1082\1088\1110\1084" xs),+ ("\1054\1090\1078", howConcat1Word n 1 us "\1077" "\1054\1090\1078\1077" xs),+ ("\1054\1090\1086", howConcat1Word n 1 us "\1078" "\1054\1090\1086\1078" xs),+ ("\1055\1088\1080", if take 4 us == "\1090\1086\1084\1091" then "\1055\1088\1080\1090\1086\1084\1091":+ reverseConcat1 n (drop 4 us) else if take 3 us == "\1090\1110\1084"+ then "\1055\1088\1080\1090\1110\1084":reverseConcat1 n (drop 3 us) else if take 4 us == "\1095\1086\1084\1091"+ then "\1055\1088\1080\1095\1086\1084\1091":reverseConcat1 n (drop 4 us)+ else if take 3 us == "\1095\1110\1084" then "\1055\1088\1080\1095\1110\1084":reverseConcat1 n (drop 3 us)+ else [xs]),+ ("\1057\1072\1084", howConcat1Word n 1 us "\1077" "\1057\1072\1084\1077" xs),+ ("\1057\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1057\1077\1073\1090\1086" xs),+ ("\1058\1072\1082", howConcat1Word n 1 us "\1080" "\1058\1072\1082\1080" xs),+ ("\1058\1086\1073", howConcat1Word n 2 us "\1090\1086" "\1058\1086\1073\1090\1086" xs),+ howConcat1WordEntirely n "\1061\1072\1081" us,+ ("\1061\1110\1073", howConcat1Word n 1 us "\1072" "\1061\1110\1073\1072" xs),+ ("\1062\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1062\1077\1073\1090\1086" xs),+ howConcat1WordEntirely n "\1065\1086\1073" us,+ ("\1071\1082\1073", howConcat1Word n 1 us "\1080" "\1071\1082\1073\1080" xs),+ ("\1071\1082\1088", howConcat1Word n 2 us "\1072\1079" "\1071\1082\1088\1072\1079" xs),+ ("\1071\1082\1097", howConcat1Word n 1 us "\1086" "\1071\1082\1097\1086" xs),+ howConcat1WordEntirely n "\1072\1073\1086" us,("\1072\1076\1078",+ howConcat1Word n 1 us "\1077" "\1072\1076\1078\1077" xs),howConcat1WordEntirely n "\1072\1083\1077" us,+ ("\1072\1085\1110", howConcat1Word n 1 us "\1078" "\1072\1085\1110\1078" xs),+ ("\1073\1086\1076",howConcat1Word n 2 us "\1072\1081" "\1073\1086\1076\1072\1081" xs),+ ("\1073\1091\1094",howConcat1Word n 4 us "\1110\1084\1090\1086" "\1073\1091\1094\1110\1084\1090\1086" xs),+ howConcat1WordEntirely n "\1074\1078\1077" us, ("\1074\1080\1082",+ howConcat1Word n 5 us "\1083\1102\1095\1085\1086" "\1074\1080\1082\1083\1102\1095\1085\1086" xs),+ ("\1074\1083\1072",howConcat1Word n 3 us "\1089\1085\1077" "\1074\1083\1072\1089\1085\1077" xs),+ ("\1074\1084\1110",if take 8 us == "\1088\1091\1090\1086\1075\1086\1103\1082"+ then "\1074":"\1084\1110\1088\1091":"\1090\1086\1075\1086":"\1103\1082":reverseConcat1 n (drop 11 xs)+ else [xs]), ("\1074\1090\1110",howConcat1Word n 1 us "\1084" "\1074\1090\1110\1084" xs),+ ("\1076\1072\1074",howConcat1Word n 2 us "\1072\1081" "\1076\1072\1074\1072\1081" xs),+ ("\1076\1072\1088",howConcat1Word n 4 us "\1084\1072\1097\1086" "\1076\1072\1088\1084\1072\1097\1086" xs),+ ("\1076\1083\1103", if take 7 us == "\1090\1086\1075\1086\1097\1086\1073"+ then "\1076\1083\1103":"\1090\1086\1075\1086":"\1097\1086\1073":reverseConcat1 n (drop 7 xs)+ else [xs]), ("\1079\1072\1083", if take 7 us == "\1077\1078\1085\1086\1074\1110\1076"+ then "\1079\1072\1083\1077\1078\1085\1086":"\1074\1110\1076":reverseConcat1 n (drop 7 xs)+ else [xs]), ("\1079\1072\1084", if take 11 us == "\1110\1089\1090\1100\1090\1086\1075\1086\1097\1086\1073"+ then "\1079\1072\1084\1110\1089\1090\1100":"\1090\1086\1075\1086":"\1097\1086\1073":+ reverseConcat1 n (drop 11 xs) else [xs]),+ ("\1079\1072\1088", howConcat1Word n 3 us "\1072\1076\1080" "\1079\1072\1088\1072\1076\1080" xs),+ ("\1079\1072\1090", howConcat1Word n 1 us "\1077" "\1079\1072\1090\1077" xs), ("\1079\1090\1080",+ if take 4 us == "\1084\1097\1086\1073" then "\1079":"\1090\1080\1084":"\1097\1086\1073":+ reverseConcat1 n (drop 4 xs) else [xs]),+ ("\1079\1090\1086", if take 8 us == "\1075\1086\1095\1072\1089\1091\1103\1082"+ then "\1079":"\1090\1086\1075\1086":"\1095\1072\1089\1091":"\1103\1082":reverseConcat1 n (drop 8 xs)+ else [xs]), ("\1082\1086\1083", howConcat1Word n 1 us "\1080" "\1082\1086\1083\1080" xs),+ ("\1082\1088\1110", if take 2 us == "\1079\1100" then "\1082\1088\1110\1079\1100":reverseConcat1 n (drop 2 us)+ else if take 1 us == "\1084" then "\1082\1088\1110\1084":reverseConcat1 n (drop 1 us) else [xs]),+ ("\1083\1077\1076", howConcat1Word n 2 us "\1074\1077" "\1083\1077\1076\1074\1077" xs),+ ("\1083\1080\1096", howConcat1Word n 1 us "\1077" "\1083\1080\1096\1077" xs),+ ("\1084\1072\1081", howConcat1Word n 2 us "\1078\1077" "\1084\1072\1081\1078\1077" xs),+ ("\1084\1086\1074", if take 4 us == "\1073\1080\1090\1086" then "\1084\1086\1074\1073\1080\1090\1086":+ reverseConcat1 n (drop 4 us)+ else if take 2 us == "\1073\1080" then "\1084\1086\1074\1073\1080":reverseConcat1 n (drop 2 us)+ else snd (howConcat1WordEntirely n "\1084\1086\1074" us)),+ ("\1085\1072\1074", howConcat1Word n 3 us "\1110\1090\1100" "\1085\1072\1074\1110\1090\1100" xs),+ ("\1085\1072\1089", howConcat1Word n 6 us "\1082\1110\1083\1100\1082\1080" "\1085\1072\1089\1082\1110\1083\1100\1082\1080" xs),+ ("\1085\1072\1095", if take 4 us == "\1077\1073\1090\1086" then "\1085\1072\1095\1077\1073\1090\1086":+ reverseConcat1 n (drop 4 us)+ else if take 2 us == "\1077\1073" then "\1085\1072\1095\1077\1073":reverseConcat1 n (drop 2 us)+ else if take 1 us == "\1077"+ then "\1085\1072\1095\1077":reverseConcat1 n (drop 1 us) else [xs]),("\1085\1077\1074",+ howConcat1Word n 2 us "\1078\1077" "\1085\1077\1074\1078\1077" xs),+ ("\1085\1077\1079", if take 9 us == "\1072\1083\1077\1078\1085\1086\1074\1110\1076"+ then "\1085\1077\1079\1072\1083\1077\1078\1085\1086\1074\1110\1076":reverseConcat1 n (drop 9 us) else+ if take 13 us == "\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"+ then "\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086":+ reverseConcat1 n (drop 13 us)+ else [xs]),("\1085\1077\1084", if take 6 us == "\1086\1074\1073\1080\1090\1086"+ then "\1085\1077\1084\1086\1074\1073\1080\1090\1086":reverseConcat1 n (drop 6 us)+ else if take 4 us == "\1086\1074\1073\1080" then "\1085\1077\1084\1086\1074\1073\1080":+ reverseConcat1 n (drop 4 us) else+ if take 2 us == "\1086\1074" then "\1085\1077\1084\1086\1074":reverseConcat1 n (drop 2 us) else [xs]),+ ("\1085\1077\1085", if take 6 us == "\1072\1095\1077\1073\1090\1086"+ then "\1085\1077\1085\1072\1095\1077\1073\1090\1086":reverseConcat1 n (drop 6 us)+ else if take 3 us == "\1072\1095\1077" then "\1085\1077\1085\1072\1095\1077":+ reverseConcat1 n (drop 3 us) else [xs]),+ ("\1085\1077\1093", howConcat1Word n 2 us "\1072\1081" "\1085\1077\1093\1072\1081" xs),+ ("\1085\1110\1073", if take 3 us == "\1080\1090\1086" then "\1085\1110\1073\1080\1090\1086":+ reverseConcat1 n (drop 3 us) else+ if take 1 us == "\1080" then "\1085\1110\1073\1080":reverseConcat1 n (drop 1 us) else [xs]),+ howConcat1WordEntirely n "\1085\1110\1078" us,+ ("\1086\1082\1088", howConcat1Word n 2 us "\1110\1084" "\1086\1082\1088\1110\1084" xs),+ ("\1086\1090\1078", howConcat1Word n 1 us "\1077" "\1086\1090\1078\1077" xs),+ ("\1086\1090\1086", howConcat1Word n 1 us "\1078" "\1086\1090\1086\1078" xs),+ ("\1087\1086\1087", if take 6 us == "\1088\1080\1090\1077\1097\1086"+ then "\1087\1086\1087\1088\1080":"\1090\1077":"\1097\1086":reverseConcat1 n (drop 6 us) else [xs]),+ ("\1087\1088\1080", if take 4 us == "\1090\1086\1084\1091" then "\1087\1088\1080\1090\1086\1084\1091":+ reverseConcat1 n (drop 4 us)+ else if take 3 us == "\1090\1110\1084" then "\1087\1088\1080\1090\1110\1084":+ reverseConcat1 n (drop 3 us) else+ if take 5 us == "\1094\1100\1086\1084\1091" then "\1087\1088\1080\1094\1100\1086\1084\1091":+ reverseConcat1 n (drop 5 us) else+ if take 4 us == "\1095\1086\1084\1091" then "\1087\1088\1080\1095\1086\1084\1091":+ reverseConcat1 n (drop 4 us) else+ if take 3 us == "\1095\1110\1084" then "\1087\1088\1080\1095\1110\1084":reverseConcat1 n (drop 3 us)+ else [xs]),+ ("\1087\1088\1086", howConcat1Word n 2 us "\1090\1077" "\1087\1088\1086\1090\1077" xs),+ ("\1087\1110\1089", if take 8 us == "\1083\1103\1090\1086\1075\1086\1103\1082"+ then "\1087\1110\1089\1083\1103":"\1090\1086\1075\1086":"\1103\1082":reverseConcat1 n (drop 8 us)+ else [xs]), ("\1089\1072\1084", howConcat1Word n 1 us "\1077" "\1089\1072\1084\1077" xs),+ ("\1089\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1089\1077\1073\1090\1086" xs),+ ("\1090\1072\1082", if take 1 us == "\1080" then "\1090\1072\1082\1080":reverseConcat1 n (drop 1 us) else+ if take 3 us == "\1081\1072\1082" then "\1090\1072\1082":"\1103\1082":reverseConcat1 n (drop 3 us) else+ if take 2 us == "\1097\1086" then "\1090\1072\1082":"\1097\1086":reverseConcat1 n (drop 2 us) else [xs]),+ ("\1090\1080\1084", if take 8 us == "\1095\1072\1089\1086\1084\1081\1072\1082"+ then "\1090\1080\1084":"\1095\1072\1089\1086\1084":"\1103\1082":reverseConcat1 n (drop 8 us) else [xs]),+ ("\1090\1086\1073", howConcat1Word n 2 us "\1090\1086" "\1090\1086\1073\1090\1086" xs),+ ("\1090\1086\1084", if take 3 us == "\1091\1097\1086" then "\1090\1086\1084\1091":"\1097\1086":+ reverseConcat1 n (drop 3 us)+ else if take 3 us == "\1091\1103\1082" then "\1090\1086\1084\1091":"\1103\1082":+ reverseConcat1 n (drop 3 us) else [xs]),+ ("\1090\1110\1083", howConcat1Word n 3 us "\1100\1082\1080" "\1090\1110\1083\1100\1082\1080" xs),+ ("\1091\1079\1074", if take 6 us == "\1081\1072\1079\1082\1091\1079"+ then "\1091":"\1079\1074\x02BC\1103\1079\1082\1091":"\1079":reverseConcat1 n (drop 6 us) else [xs]),+ ("\1091\1084\1110", if take 8 us == "\1088\1091\1090\1086\1075\1086\1103\1082"+ then "\1091":"\1084\1110\1088\1091":"\1090\1086\1075\1086":"\1103\1082":reverseConcat1 n (drop 8 us)+ else [xs]), howConcat1WordEntirely n "\1093\1072\1081" us,("\1093\1086\1095", if take 2 us == "\1073\1080"+ then "\1093\1086\1095":"\1073\1080":reverseConcat1 n (drop 2 us) else if take 2 us == "\1072\1073"+ then "\1093\1086\1095\1072":"\1073":reverseConcat1 n (drop 2 us) else "\1093\1086\1095":[us]),+ ("\1093\1110\1073", howConcat1Word n 1 us "\1072" "\1093\1110\1073\1072" xs),+ ("\1094\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1094\1077\1073\1090\1086" xs),+ ("\1095\1077\1088", if take 6 us == "\1077\1079\1090\1077\1097\1086"+ then "\1095\1077\1088\1077\1079":"\1090\1077":"\1097\1086":reverseConcat1 n (drop 6 us) else [xs]),+ howConcat1WordEntirely n "\1097\1086\1073" us, ("\1103\1082\1073",+ howConcat1Word n 1 us "\1080" "\1103\1082\1073\1080" xs),+ ("\1103\1082\1088", howConcat1Word n 2 us "\1072\1079" "\1103\1082\1088\1072\1079" xs),+ ("\1103\1082\1097", howConcat1Word n 1 us "\1086" "\1103\1082\1097\1086" xs)] ts+ where (ts,us) = splitAt 3 xs++reverseConcat2 :: Int -> String -> String -> String -> [String]+reverseConcat2 n xs ts us =+ getBFstLSorted' [xs] [("\1041\1110\1083", howConcat1Word n 1 us "\1103" "\1041\1110\1083\1103" xs),+ ("\1042\1080\1082", howConcat1Word n 5 us "\1083\1102\1095\1085\1086" "\1042\1080\1082\1083\1102\1095\1085\1086" xs),+ ("\1044\1072\1074", howConcat1Word n 2 us "\1072\1081" "\1044\1072\1074\1072\1081" xs),+ ("\1047\1072\1090", howConcat1Word n 1 us "\1077" "\1047\1072\1090\1077" xs),+ ("\1050\1086\1083", if take 1 us == "\1080" then "\1050\1086\1083\1080":reverseConcat1 n (drop 1 us)+ else if take 1 us == "\1086" then "\1050\1086\1083\1086":reverseConcat1 n (drop 1 us) else [xs]),+ ("\1051\1080\1096", howConcat1Word n 1 us "\1077" "\1051\1080\1096\1077" xs),+ howConcat1WordEntirely n "\1053\1110\1078" us,+ ("\1055\1110\1089", howConcat1Word n 2 us "\1083\1103" "\1055\1110\1089\1083\1103" xs),+ ("\1057\1077\1088", howConcat1Word n 2 us "\1077\1076" "\1057\1077\1088\1077\1076" xs),+ ("\1058\1110\1083", howConcat1Word n 3 us "\1100\1082\1080" "\1058\1110\1083\1100\1082\1080" xs),+ ("\1073\1110\1083", howConcat1Word n 1 us "\1103" "\1073\1110\1083\1103" xs),+ ("\1076\1072\1074", howConcat1Word n 2 us "\1072\1081" "\1076\1072\1074\1072\1081" xs),+ ("\1079\1072\1090", howConcat1Word n 1 us "\1077" "\1079\1072\1090\1077" xs),+ ("\1082\1086\1083", if take 1 us == "\1080" then "\1082\1086\1083\1080":reverseConcat1 n xs+ else if take 1 us == "\1086" then "\1082\1086\1083\1086":reverseConcat1 n xs else [xs]),+ ("\1083\1080\1096", howConcat1Word n 1 us "\1077" "\1083\1080\1096\1077" xs),+ howConcat1WordEntirely n "\1085\1110\1078" us,+ ("\1087\1077\1088", howConcat1Word n 2 us "\1077\1076" "\1087\1077\1088\1077\1076" xs),+ ("\1087\1110\1089", howConcat1Word n 2 us "\1083\1103" "\1087\1110\1089\1083\1103" xs),+ ("\1089\1077\1088", howConcat1Word n 2 us "\1077\1076" "\1089\1077\1088\1077\1076" xs)] ts++howConcat1Word :: Int -> Int -> String -> String -> String -> String -> [String]+howConcat1Word m n us us' us'' xs+ | take n us == us' = us'':reverseConcat1 m (drop n us)+ | otherwise = [xs]+{-# INLINE howConcat1Word #-}++howConcat1WordEntirely :: Int -> String -> String -> (String, [String])+howConcat1WordEntirely m ts us = (ts,ts:reverseConcat1 m us)+{-# INLINE howConcat1WordEntirely #-}
− Phonetic/Languages/Ukrainian/PrepareText.hs
@@ -1,375 +0,0 @@--- |--- Module : Phonetic.Languages.Ukrainian.PrepareText--- Copyright : (c) OleksandrZhabenko 2020-2022--- License : MIT--- Stability : Experimental--- Maintainer : olexandr543@yahoo.com------ Helps to order the 7 or less Ukrainian words (or their concatenations)--- to obtain (to some extent) suitable for poetry or music text.--- Earlier it has been a module DobutokO.Poetry.Ukrainian.PrepareText--- from the @dobutokO-poetry@ package.--- In particular, this module can be used to prepare the Ukrainian text--- by applying the most needed grammar to avoid misunderstanding--- for the produced text. The attention is paid to the prepositions, pronouns, conjunctions--- and particles that are most commonly connected (or not) in a significant way--- with the next text.--- Uses the information from:--- https://uk.wikipedia.org/wiki/%D0%A1%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%BD%D0%B8%D0%BA--- and--- https://uk.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BA%D0%B0_(%D0%BC%D0%BE%D0%B2%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%BE)------ Uses arrays instead of vectors.--module Phonetic.Languages.Ukrainian.PrepareText (- -- * Basic functions- complexWords- , participleConc- , splitLines- , splitLinesN- , auxiliary1- , isPreposition- , isParticipleAppended- , isPrepended- , isConcatenated- , isSpC- , isUkrainianL- , concatenated2- , jottedConv- , jottedCnv- -- * The end-user functions- , prepareText- , prepareTextN- , growLinesN- , prepareGrowTextMN- , tuneLinesN- , prepareTuneTextMN- -- * Used to transform after convertToProperUkrainian from mmsyn6ukr package- , aux4-) where--import CaseBi.Arr (getBFstLSorted')-import Data.List.InnToOut.Basic (mapI)-import Data.Char (isAlpha,toLower)-import GHC.Arr-import GHC.List (scanl1)-import Data.Monoid (mappend)---- | Is used to convert a Ukrainian text into list of 'String' each of which is ready to be--- used by the functions of the modules for the phonetic languages approach.--- It applies minimal grammar links and connections between the most commonly used Ukrainian--- words that \"should\" be paired and not dealt with separately--- to avoid the misinterpretation and preserve maximum of the semantics for the--- \"phonetic\" language on the Ukrainian basis.-prepareText :: String -> [String]-prepareText = prepareTextN 7-{-# INLINE prepareText #-}---- | Concatenates complex words in Ukrainian so that they are not separated further by possible words order rearrangements (because they are treated--- as a single word). This is needed to preserve basic grammar in phonetic languages.-complexWords :: [String] -> [String]-complexWords wwss@(xs:ys:zs:ts:xss) =- getBFstLSorted' (xs:complexWords (ys:zs:ts:xss)) ([("\1074",- if ys == "\1084\1110\1088\1091" && zs == "\1090\1086\1075\1086" &&- ts == "\1103\1082" then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss else auxiliary4 wwss),- ("\1076\1072\1088\1084\1072", if ys == "\1097\1086"- then auxiliary3 wwss else auxiliary4 wwss), ("\1076\1083\1103",- if ys == "\1090\1086\1075\1086" && zs == "\1097\1086\1073"- then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss- else auxiliary4 wwss), ("\1079",- case ys of- "\1090\1080\1084" -> if zs == "\1097\1086\1073"- then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)- else auxiliary4 wwss- "\1090\1086\1075\1086" -> if zs == "\1095\1072\1089\1091" && ts == "\1103\1082"- then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` "\1081\1072\1082") xss- else auxiliary4 wwss- _ -> auxiliary4 wwss), ("\1079\1072\1083\1077\1078\1085\1086",- if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),- ("\1079\1072\1084\1110\1089\1090\1100",- if ys == "\1090\1086\1075\1086" && zs == "\1097\1086\1073"- then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)- else auxiliary4 wwss), ("\1087\1086\1087\1088\1080",- if ys == "\1090\1077" && zs == "\1097\1086" then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)- else auxiliary4 wwss),("\1085\1077\1079\1072\1083\1077\1078\1085\1086",- if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),- ("\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080", if ys == "\1085\1072" then- if zs == "\1090\1077" && ts == "\1097\1086" then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss- else auxiliary3 wwss else auxiliary4 wwss),- ("\1087\1088\1080",- if ys == "\1094\1100\1086\1084\1091" then auxiliary3 wwss- else auxiliary4 wwss), ("\1087\1110\1089\1083\1103",- if ys == "\1090\1086\1075\1086" && zs == "\1103\1082" then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss)- else auxiliary4 wwss), ("\1090\1072\1082", if (ys == "\1097\1086") || (ys == "\1103\1082")- then auxiliary3 wwss else auxiliary4 wwss),- ("\1090\1080\1084\1095\1072\1089\1086\1084", if ys == "\1103\1082"- then auxiliary3 wwss else auxiliary4 wwss),- ("\1090\1086\1084\1091", if ys == "\1103\1082" then auxiliary2Inner (xs `mappend` "\1081\1072\1082") (zs:ts:xss)- else auxiliary4 wwss), ("\1091",- if (ys == "\1079\1074'\1103\1079\1082\1091" || ys == "\1079\1074\x02BC\1103\1079\1082\1091") && zs == "\1079"- then auxiliary2Inner (xs `mappend` "\1079\1074\1081\1072\1079\1082\1091" `mappend` zs) (ts:xss)- else if ys == "\1084\1110\1088\1091" && zs == "\1090\1086\1075\1086" && ts == "\1103\1082"- then auxiliary2Inner (xs `mappend` ys `mappend` zs `mappend` ts) xss else auxiliary4 wwss),- ("\1093\1086\1095", if ys == "\1073\1080" then auxiliary3 wwss- else auxiliary4 wwss), ("\1093\1086\1095\1072", if ys == "\1073"- then auxiliary3 wwss else auxiliary4 wwss),- ("\1095\1077\1088\1077\1079", if ys == "\1090\1077" && zs == "\1097\1086"- then auxiliary2Inner (xs `mappend` ys `mappend` zs) (ts:xss) else auxiliary4 wwss)]) xs-complexWords wwss@(xs:ys:zs:xss) =- getBFstLSorted' (xs:complexWords [ys,zs]) ([("\1076\1072\1088\1084\1072", if ys == "\1097\1086"- then auxiliary3 wwss else auxiliary4 wwss), ("\1079\1072\1083\1077\1078\1085\1086",- if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),- ("\1085\1077\1079\1072\1083\1077\1078\1085\1086",- if ys == "\1074\1110\1076" then auxiliary3 wwss else auxiliary4 wwss),- ("\1087\1088\1080",- if ys == "\1094\1100\1086\1084\1091" then auxiliary3 wwss- else auxiliary4 wwss), ("\1090\1072\1082", if ys == "\1097\1086" || ys == "\1103\1082"- then auxiliary3 wwss else auxiliary4 wwss),- ("\1090\1080\1084\1095\1072\1089\1086\1084", if ys == "\1103\1082"- then auxiliary3 wwss else auxiliary4 wwss),- ("\1090\1086\1084\1091", if ys == "\1103\1082" then auxiliary2Inner (xs `mappend` "\1081\1072\1082") (zs:xss)- else auxiliary4 wwss), ("\1093\1086\1095", if ys == "\1073\1080" then auxiliary3 wwss- else auxiliary4 wwss), ("\1093\1086\1095\1072", if ys == "\1073"- then auxiliary3 wwss else auxiliary4 wwss)]) xs-complexWords [xs,ys]- | ys `elem` ["\1073","\1073\1060","\1078\1077","\1078"] = [xs `mappend` ys]- | xs == "\1076\1072\1088\1084\1072" && ys == "\1097\1086" = [xs `mappend` ys]- | otherwise = [xs,ys]-complexWords xss = xss--auxiliary2Inner :: String -> [String] -> [String]-auxiliary2Inner ts (xs:ys:xss)- | (concatenated2 . auxiliary1 $ [xs,ys]) /= [xs,ys] = let (rs,ws) = splitAt 1 (concatenated2 . auxiliary1 $ [xs,ys]) in- (ts `mappend` head rs):complexWords (concat [ws,xss])- | otherwise = (ts `mappend` xs):complexWords (ys:xss)-auxiliary2Inner ts [xs] = [ts `mappend` xs]-auxiliary2Inner ts _ = [ts]--auxiliary3 :: [String] -> [String]-auxiliary3 (xs:ys:xss) = auxiliary2Inner (xs `mappend` ys) xss-auxiliary3 xss = xss-{-# INLINE auxiliary3 #-}--auxiliary4 :: [String] -> [String]-auxiliary4 (xs:xss) = auxiliary2Inner xs xss-auxiliary4 xss = xss-{-# INLINE auxiliary4 #-}---- | Since 0.2.1.0 version the function is recursive and is applied so that all returned elements ('String') are no longer than 7 words in them.-splitLines :: [String] -> [String]-splitLines = splitLinesN 7-{-# INLINE splitLines #-}---- | A generalized variant of the 'splitLines' with the arbitrary maximum number of the words in the lines given as the first argument.-splitLinesN :: Int -> [String] -> [String]-splitLinesN n xss- | null xss || n <= 0 = []- | otherwise = mapI (\xs -> compare (length . words $ xs) n == GT) (\xs -> let yss = words xs in- splitLines . map unwords . (\(q,r) -> [q,r]) . splitAt (length yss `quot` 2) $ yss) $ xss---- | A generalized variant of the 'prepareText' with the arbitrary maximum number of the words in the lines given as the first argument.-prepareTextN :: Int -> String -> [String]-prepareTextN n = filter (any isUkrainianL) . splitLinesN n .- map (unwords . concatenated2 . participleConc . auxiliary1 . complexWords . words . filter (\t -> isAlpha t || isSpC t)) .- filter (not . null) . lines--participleConc :: [String] -> [String]-participleConc (xs:ys:zs:yss)- | isParticipleAppended ys = if isParticipleAppended zs then (xs `mappend` ys `mappend` zs):participleConc yss- else participleConc (xs `mappend` ys:zs:yss)- | otherwise = xs:participleConc (ys:zs:yss)-participleConc (xs:ys:yss)- | isParticipleAppended ys = (xs `mappend` ys):participleConc yss- | otherwise = xs:participleConc (ys:yss)-participleConc yss = yss--isParticipleAppended :: String -> Bool-isParticipleAppended xs = xs `elem` ["\1073","\1073\1080","\1078\1077","\1078"]--isPrepended :: String -> Bool-isPrepended xs- | isParticipleAppended xs = True- | isPreposition xs = True- | otherwise = isConcatenated xs--jottedCnv :: String -> String-jottedCnv xs = drop 1 . jottedConv $ ' ':xs--auxiliary1 :: [String] -> [String]-auxiliary1 yss@(xs:zs:xss)- | isParticipleAppended xs = xs:auxiliary1 (zs:xss)- | isPreposition xs || isConcatenated xs = auxiliary1 (concatMap jottedCnv (tss `mappend` wss):vss)- | otherwise = xs:auxiliary1 (zs:xss)- where (tss,uss) = span isPrepended yss- (wss,vss) = splitAt 1 uss-auxiliary1 xss = xss--isPreposition :: String -> Bool-isPreposition ts =- getBFstLSorted' False- (zip ["\1030\1079", "\1041\1077\1079", "\1041\1110\1083\1103", "\1042",- "\1042\1110\1076", "\1044\1083\1103", "\1044\1086", "\1047",- "\1047\1072", "\1047\1072\1088\1072\1076\1080", "\1047\1110",- "\1050", "\1050\1086\1083\1086", "\1050\1088\1110\1079\1100",- "\1050\1088\1110\1084", "\1052\1077\1078", "\1052\1077\1078\1080",- "\1052\1110\1078", "\1053\1072", "\1053\1072\1076", "\1054",- "\1054\1073", "\1054\1076", "\1054\1082\1088\1110\1084",- "\1055\1077\1088\1077\1076", "\1055\1086", "\1055\1088\1080",- "\1055\1088\1086", "\1055\1088\1086\1090\1080",- "\1055\1110\1076", "\1055\1110\1089\1083\1103",- "\1057\1077\1088\1077\1076", "\1057\1077\1088\1077\1076\1080",- "\1059", "\1063\1077\1088\1077\1079", "\1073\1077\1079",- "\1073\1110\1083\1103", "\1074", "\1074\1110\1076",- "\1076\1083\1103", "\1076\1086", "\1079", "\1079\1072",- "\1079\1072\1088\1072\1076\1080", "\1079\1110",- "\1082", "\1082\1086\1083\1086", "\1082\1088\1110\1079\1100",- "\1082\1088\1110\1084", "\1084\1077\1078", "\1084\1077\1078\1080",- "\1084\1110\1078", "\1085\1072", "\1085\1072\1076", "\1086",- "\1086\1073", "\1086\1076", "\1086\1082\1088\1110\1084",- "\1087\1077\1088\1077\1076", "\1087\1086", "\1087\1088\1080",- "\1087\1088\1086", "\1087\1088\1086\1090\1080", "\1087\1110\1076",- "\1087\1110\1089\1083\1103", "\1089\1077\1088\1077\1076",- "\1089\1077\1088\1077\1076\1080", "\1091",- "\1095\1077\1088\1077\1079", "\1110\1079"] $- replicate 200 True) ts-{-# INLINE isPreposition #-}---- | Since the dobutokO-poetry version 0.16.3.0 the (||) operator has been changed to the (&&).--- The idea is that these words are the ones that are pronouns and they \"should\" be treated--- (by the author's understanding) as independent words.-isConcatenated :: String -> Bool-isConcatenated ts- | null ts = False- | otherwise = compare (length ts) 2 /= GT &&- getBFstLSorted' True (zip ["\1028", "\1042\1080", "\1052\1080", "\1058\1080", "\1058\1110",- "\1062\1110", "\1071", "\1074\1080", "\1084\1080", "\1090\1080", "\1090\1110",- "\1094\1110", "\1103", "\1108"] $ replicate 14 False) ts && (head ts `notElem` "\1031\1111")-{-# INLINE isConcatenated #-}--concatenated2 :: [String] -> [String]-concatenated2 (xs:ys:xss) =- getBFstLSorted' (xs:concatenated2 (ys:xss)) (zip ["\1040\1073\1086","\1040\1076\1078\1077",- "\1040\1083\1077","\1040\1085\1110\1078","\1041\1086\1076\1072\1081",- "\1041\1091\1094\1110\1084\1090\1086","\1042\1078\1077","\1042\1080\1082\1083\1102\1095\1085\1086",- "\1042\1083\1072\1089\1085\1077","\1042\1090\1110\1084","\1044\1072\1074\1072\1081",- "\1047\1072\1090\1077","\1050\1086\1083\1080","\1051\1077\1076\1074\1077","\1051\1080\1096\1077",- "\1052\1072\1081\1078\1077","\1052\1086\1074","\1052\1086\1074\1073\1080",- "\1052\1086\1074\1073\1080\1090\1086","\1053\1072\1074\1110\1090\1100",- "\1053\1072\1089\1082\1110\1083\1100\1082\1080","\1053\1072\1095\1077","\1053\1072\1095\1077\1073",- "\1053\1072\1095\1077\1073\1090\1086","\1053\1077\1074\1078\1077","\1053\1077\1084\1086\1074",- "\1053\1077\1084\1086\1074\1073\1080","\1053\1077\1084\1086\1074\1073\1080\1090\1086",- "\1053\1077\1085\1072\1095\1077","\1053\1077\1085\1072\1095\1077\1073\1090\1086",- "\1053\1077\1093\1072\1081","\1053\1090\1078\1077","\1053\1110\1073\1080",- "\1053\1110\1073\1080\1090\1086","\1053\1110\1078","\1054\1090\1086\1078",- "\1055\1088\1080\1090\1086\1084\1091","\1055\1088\1080\1090\1110\1084",- "\1055\1088\1080\1095\1086\1084\1091","\1055\1088\1080\1095\1110\1084",- "\1055\1088\1086\1090\1077","\1057\1072\1084\1077","\1057\1077\1073\1090\1086",- "\1058\1072\1082\1080","\1058\1086\1073\1090\1086","\1058\1110\1083\1100\1082\1080",- "\1061\1072\1081","\1061\1086\1095","\1061\1110\1073\1072","\1062\1077\1073\1090\1086",- "\1065\1086\1073","\1071\1082\1073\1080","\1071\1082\1088\1072\1079","\1071\1082\1097\1086",- "\1072\1073\1086","\1072\1076\1078\1077","\1072\1083\1077","\1072\1085\1110\1078",- "\1073\1086\1076\1072\1081","\1073\1091\1094\1110\1084\1090\1086","\1074\1078\1077",- "\1074\1080\1082\1083\1102\1095\1085\1086","\1074\1083\1072\1089\1085\1077",- "\1074\1090\1110\1084","\1076\1072\1074\1072\1081","\1079\1072\1090\1077","\1082\1086\1083\1080",- "\1083\1077\1076\1074\1077","\1083\1080\1096\1077","\1084\1072\1081\1078\1077","\1084\1086\1074",- "\1084\1086\1074\1073\1080","\1084\1086\1074\1073\1080\1090\1086","\1085\1072\1074\1110\1090\1100",- "\1085\1072\1089\1082\1110\1083\1100\1082\1080","\1085\1072\1095\1077","\1085\1072\1095\1077\1073",- "\1085\1072\1095\1077\1073\1090\1086","\1085\1077\1074\1078\1077","\1085\1077\1084\1086\1074",- "\1085\1077\1084\1086\1074\1073\1080","\1085\1077\1084\1086\1074\1073\1080\1090\1086",- "\1085\1077\1085\1072\1095\1077","\1085\1077\1085\1072\1095\1077\1073\1090\1086",- "\1085\1077\1093\1072\1081","\1085\1110\1073\1080","\1085\1110\1073\1080\1090\1086",- "\1085\1110\1078","\1086\1090\1078\1077","\1086\1090\1086\1078","\1087\1088\1080\1090\1086\1084\1091",- "\1087\1088\1080\1090\1110\1084","\1087\1088\1080\1095\1086\1084\1091","\1087\1088\1080\1095\1110\1084",- "\1087\1088\1086\1090\1077","\1089\1072\1084\1077","\1089\1077\1073\1090\1086","\1090\1072\1082\1080",- "\1090\1086\1073\1090\1086","\1090\1110\1083\1100\1082\1080","\1093\1072\1081","\1093\1086\1095",- "\1093\1110\1073\1072","\1094\1077\1073\1090\1086","\1097\1086\1073","\1103\1082\1073\1080",- "\1103\1082\1088\1072\1079","\1103\1082\1097\1086"] $ replicate 200 ((xs `mappend` jottedCnv ys):concatenated2 xss)) xs-concatenated2 xss = xss--isSpC :: Char -> Bool-isSpC x = x == '\'' || x == ' ' || x == '\x2019' || x == '\x02BC' || x == '-'-{-# INLINE isSpC #-}--jottedConv :: String -> String-jottedConv (x:y:xs)- | isSpC x = x:(getBFstLSorted' (jottedConv (y:xs))- [('\1028', '\1049':'\1077':jottedConv xs),- ('\1031', '\1049':'\1110':jottedConv xs),- ('\1070', '\1049':'\1091':jottedConv xs),- ('\1071', '\1049':'\1072':jottedConv xs),- ('\1102', '\1081':'\1091':jottedConv xs),- ('\1103', '\1081':'\1072':jottedConv xs),- ('\1108', '\1081':'\1077':jottedConv xs),- ('\1111', '\1081':'\1110':jottedConv xs)] y)- | otherwise = x:jottedConv (y:xs)-jottedConv xs = xs---- | Can be used to prepare the text after 'convertToProperUkrainian' from 'Melodics.Ukrainian' module from @mmsyn6ukr@ package so that all the 'String' can--- be represented as unique 'Char'.-aux4 :: String -> Char-aux4 xs- | xs == "\1076\1078" = 'j'- | xs == "\1076\1079" = 'z'- | xs == "\1089\1100" = 's'- | xs == "\1094\1100" = 'c'- | null xs = error "Phonetic.Languages.Ukrainian.PrepareText.aux4: Empty String. "- | otherwise = head xs---- | Is taken from the @mmsyn6ukr@ package version 0.8.1.0 so that the amount of dependencies are reduced (and was slightly modified).-isUkrainianL :: Char -> Bool-isUkrainianL y | (y >= '\1040' && y <= '\1065') || (y >= '\1070' && y <= '\1097') = True- | otherwise = getBFstLSorted' False (map (\x -> (x, True)) $ "\1028\1030\1031\1068\1100\1102\1103\1108\1110\1111\1168\1169\8217") y-----------------------------------------{-| @ since 0.2.0.0-Given a positive number and a list tries to rearrange the list's 'String's by concatenation of the several elements of the list-so that the number of words in every new 'String' in the resulting list is not greater than the 'Int' argument. If some of the-'String's have more than that number quantity of the words then these 'String's are preserved.--}-growLinesN :: Int -> [String] -> [String]-growLinesN n xss- | null xss || n < 0 = []- | otherwise = unwords yss : growLinesN n zss- where l = length . takeWhile (<= n) . scanl1 (+) . map (length . words) $ xss -- the maximum number of lines to be taken- (yss,zss) = splitAt (max l 1) xss--{-| @ since 0.2.0.0-The function combines the 'prepareTextN' and 'growLinesN' function. Applies needed phonetic language preparations-to the Ukrainian text and tries to \'grow\' the resulting 'String's in the list so that the number of the words in every-of them is no greater than the given first 'Int' number.--}-prepareGrowTextMN- :: Int -- ^ A maximum number of the words or their concatenations in the resulting list of 'String's.- -> Int -- ^ A number of words in every 'String' that the function firstly forms. To have some sense of usage, must be less than the first argument.- -> String- -> [String]-prepareGrowTextMN m n = growLinesN m . prepareTextN n-{-# INLINE prepareGrowTextMN #-}-----------------------------------------{-| @ since 0.6.0.0-Recursively splits the concatenated list of lines of words so that in every resulting 'String' in the list-except the last one there is just 'Int' -- the first argument -- words.--}-tuneLinesN :: Int -> [String] -> [String]-tuneLinesN n xss- | null xss || n < 0 = []- | otherwise =- let wss = words . unwords $ xss- (yss,zss) = splitAt n wss- in unwords yss : tuneLinesN n zss--{-| @ since 0.6.0.0-The function combines the 'prepareTextN' and 'tuneLinesN' functions. Applies needed phonetic language preparations-to the Ukrainian text and splits the list of 'String's so that the number of the words in each of them (except the last one)-is equal the given first 'Int' number.--}-prepareTuneTextMN- :: Int -- ^ A number of the words or their concatenations in the resulting list of 'String's (except probably the last one).- -> Int -- ^ A number of words in every 'String' that the function firstly forms. To have some sense of usage, must be less than the first argument.- -> String- -> [String]-prepareTuneTextMN m n = tuneLinesN m . prepareTextN n-{-# INLINE prepareTuneTextMN #-}
+ README.md view
@@ -0,0 +1,24 @@+ Devotion+ ========++The author would like to devote this project to support the [Foundation Gastrostars](https://gastrostars.nl).++On the 01/10/2023 there are International Music Day and [André's Rieu](https://www.andrerieu.com/en) Birthday. So the version 0.11.0.0 is+additionally devoted to him as well as to the Kok family — [Emma](https://emmakok.nl) and [Enzo](https://enzokok.nl) are amazing and fantastic musicians, Vico+works with PhilZuid, Sophie sings in the classical manner. Nathalie Kok with love to her family and +appreciation for André's Rieu support also celebrates the Day. In Ukraine this day has several +important celebrations — Intercession of the Holy Theotokos (Pokrova), Cossacks' Day, Day of Defenders of Ukraine (especially relevant during the Russian war against Ukraine).++On the 21/02/2024 there is an International Mother Tongue Day — that is Ukrainian for the author of the package. ++All support is welcome, including donations for the needs of the Ukrainian army, IDPs and refugees. ++If you would like to share some financial support with the Foundation Gastrostars, please, contact the mentioned foundation+using the URL:++[Contact Foundation GASTROSTARS](https://gastrostars.nl/hou-mij-op-de-hoogte)++or ++[Donation Page](https://gastrostars.nl/doneren)+
− Ukrainian/Main.hs
@@ -1,42 +0,0 @@--- |--- Module : Main--- Copyright : (c) OleksandrZhabenko 2021--- License : MIT--- Stability : Experimental--- Maintainer : olexandr543@yahoo.com--------{-# OPTIONS_GHC -threaded -rtsopts #-}--{-# LANGUAGE CPP, BangPatterns #-}--module Main where--import Ukrainian.ReverseConcatenations-import System.Environment (getArgs)-import Text.Read (readMaybe)-import Data.Maybe (fromMaybe)-#ifdef __GLASGOW_HASKELL__-#if __GLASGOW_HASKELL__==708-/* code that applies only to GHC 7.8.* */-mconcat = concat-#endif-#endif--main :: IO ()-main = do- args0 <- getArgs- let !fstA = fromMaybe 1 (readMaybe (mconcat . take 1 $ args0)::Maybe Int)- !args- | fstA == 1 = filter (/= "-i") args0- | otherwise = filter (/= "-i") . drop 1 $ args0- !stdinput = any (== "-i") args0 -- If you specify \"-i\" then reads the input text from the stdin otherwise from the file specified instead.- if stdinput then do- contents <- getContents- putStrLn . reverseConcatenations fstA $ contents- else do- let !file = concat . take 1 $ args- !toFile = concat . drop 1 . take 2 $ args- if null file then putStrLn "No file to read the Ukrainian text is specified. "- else readFile file >>= return . reverseConcatenations fstA >>= (\ts -> if null toFile then putStrLn ts else writeFile toFile ts)
− Ukrainian/ReverseConcatenations.hs
@@ -1,227 +0,0 @@--- |--- 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 CaseBi.Arr (getBFstLSorted')-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 n xs- | null xs = []- | otherwise = unlines . map (unwords . mapI (const True) (reverseConcat1 n) . words) . lines $ xs- where yss = lines xs- zsss = map words yss--{-| Reverses many phonetic languages approach related concatenations for just one Ukrainian word. Is used-internally in the 'reverseConcatenations'. -}-reverseConcat1 :: Int -> String -> [String]-reverseConcat1 n xs- | null xs = []- | otherwise = getBFstLSorted' (if n == 2 then reverseConcat2 n xs ts us else [xs]) [- howConcat1WordEntirely n "\1040\1073\1086"us,- ("\1040\1076\1078", howConcat1Word n 1 us "\1077" "\1040\1076\1078\1077" xs),- howConcat1WordEntirely n "\1040\1083\1077" us,- ("\1040\1085\1110", howConcat1Word n 1 us "\1078" "\1040\1085\1110\1078" xs),- ("\1041\1086\1076", howConcat1Word n 2 us "\1072\1081" "\1041\1086\1076\1072\1081" xs),- ("\1041\1091\1094", howConcat1Word n 4 us "\1110\1084\1090\1086" "\1041\1091\1094\1110\1084\1090\1086" xs),- howConcat1WordEntirely n "\1042\1078\1077" us,- ("\1042\1083\1072", howConcat1Word n 3 us "\1089\1085\1077" "\1042\1083\1072\1089\1085\1077" xs),- ("\1042\1090\1110", howConcat1Word n 1 us "\1084" "\1042\1090\1110\1084" xs),- howConcat1WordEntirely n "\1044\1083\1103" us,- ("\1047\1072\1088", howConcat1Word n 3 us "\1072\1076\1080" "\1047\1072\1088\1072\1076\1080" xs),- ("\1050\1088\1110", if take 2 us == "\1079\1100" then "\1050\1088\1110\1079\1100":reverseConcat1 n (drop 2 us)- else if take 1 us == "\1084" then "\1050\1088\1110\1084":reverseConcat1 n (drop 1 us) else [xs]),- ("\1053\1110\1073", if take 3 us == "\1080\1090\1086" then "\1053\1110\1073\1080\1090\1086":- reverseConcat1 n (drop 3 us) else if take 1 us == "\1080" then "\1053\1110\1073\1080":reverseConcat1 n (drop 1 us)- else [xs]),- ("\1054\1082\1088", howConcat1Word n 2 us "\1110\1084" "\1054\1082\1088\1110\1084" xs),- ("\1054\1090\1078", howConcat1Word n 1 us "\1077" "\1054\1090\1078\1077" xs),- ("\1054\1090\1086", howConcat1Word n 1 us "\1078" "\1054\1090\1086\1078" xs),- ("\1055\1088\1080", if take 4 us == "\1090\1086\1084\1091" then "\1055\1088\1080\1090\1086\1084\1091":- reverseConcat1 n (drop 4 us) else if take 3 us == "\1090\1110\1084"- then "\1055\1088\1080\1090\1110\1084":reverseConcat1 n (drop 3 us) else if take 4 us == "\1095\1086\1084\1091"- then "\1055\1088\1080\1095\1086\1084\1091":reverseConcat1 n (drop 4 us)- else if take 3 us == "\1095\1110\1084" then "\1055\1088\1080\1095\1110\1084":reverseConcat1 n (drop 3 us)- else [xs]),- ("\1057\1072\1084", howConcat1Word n 1 us "\1077" "\1057\1072\1084\1077" xs),- ("\1057\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1057\1077\1073\1090\1086" xs),- ("\1058\1072\1082", howConcat1Word n 1 us "\1080" "\1058\1072\1082\1080" xs),- ("\1058\1086\1073", howConcat1Word n 2 us "\1090\1086" "\1058\1086\1073\1090\1086" xs),- howConcat1WordEntirely n "\1061\1072\1081" us,- ("\1061\1110\1073", howConcat1Word n 1 us "\1072" "\1061\1110\1073\1072" xs),- ("\1062\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1062\1077\1073\1090\1086" xs),- howConcat1WordEntirely n "\1065\1086\1073" us,- ("\1071\1082\1073", howConcat1Word n 1 us "\1080" "\1071\1082\1073\1080" xs),- ("\1071\1082\1088", howConcat1Word n 2 us "\1072\1079" "\1071\1082\1088\1072\1079" xs),- ("\1071\1082\1097", howConcat1Word n 1 us "\1086" "\1071\1082\1097\1086" xs),- howConcat1WordEntirely n "\1072\1073\1086" us,("\1072\1076\1078",- howConcat1Word n 1 us "\1077" "\1072\1076\1078\1077" xs),howConcat1WordEntirely n "\1072\1083\1077" us,- ("\1072\1085\1110", howConcat1Word n 1 us "\1078" "\1072\1085\1110\1078" xs),- ("\1073\1086\1076",howConcat1Word n 2 us "\1072\1081" "\1073\1086\1076\1072\1081" xs),- ("\1073\1091\1094",howConcat1Word n 4 us "\1110\1084\1090\1086" "\1073\1091\1094\1110\1084\1090\1086" xs),- howConcat1WordEntirely n "\1074\1078\1077" us, ("\1074\1080\1082",- howConcat1Word n 5 us "\1083\1102\1095\1085\1086" "\1074\1080\1082\1083\1102\1095\1085\1086" xs),- ("\1074\1083\1072",howConcat1Word n 3 us "\1089\1085\1077" "\1074\1083\1072\1089\1085\1077" xs),- ("\1074\1084\1110",if take 8 us == "\1088\1091\1090\1086\1075\1086\1103\1082"- then "\1074":"\1084\1110\1088\1091":"\1090\1086\1075\1086":"\1103\1082":reverseConcat1 n (drop 11 xs)- else [xs]), ("\1074\1090\1110",howConcat1Word n 1 us "\1084" "\1074\1090\1110\1084" xs),- ("\1076\1072\1074",howConcat1Word n 2 us "\1072\1081" "\1076\1072\1074\1072\1081" xs),- ("\1076\1072\1088",howConcat1Word n 4 us "\1084\1072\1097\1086" "\1076\1072\1088\1084\1072\1097\1086" xs),- ("\1076\1083\1103", if take 7 us == "\1090\1086\1075\1086\1097\1086\1073"- then "\1076\1083\1103":"\1090\1086\1075\1086":"\1097\1086\1073":reverseConcat1 n (drop 7 xs)- else [xs]), ("\1079\1072\1083", if take 7 us == "\1077\1078\1085\1086\1074\1110\1076"- then "\1079\1072\1083\1077\1078\1085\1086":"\1074\1110\1076":reverseConcat1 n (drop 7 xs)- else [xs]), ("\1079\1072\1084", if take 11 us == "\1110\1089\1090\1100\1090\1086\1075\1086\1097\1086\1073"- then "\1079\1072\1084\1110\1089\1090\1100":"\1090\1086\1075\1086":"\1097\1086\1073":- reverseConcat1 n (drop 11 xs) else [xs]),- ("\1079\1072\1088", howConcat1Word n 3 us "\1072\1076\1080" "\1079\1072\1088\1072\1076\1080" xs),- ("\1079\1072\1090", howConcat1Word n 1 us "\1077" "\1079\1072\1090\1077" xs), ("\1079\1090\1080",- if take 4 us == "\1084\1097\1086\1073" then "\1079":"\1090\1080\1084":"\1097\1086\1073":- reverseConcat1 n (drop 4 xs) else [xs]),- ("\1079\1090\1086", if take 8 us == "\1075\1086\1095\1072\1089\1091\1103\1082"- then "\1079":"\1090\1086\1075\1086":"\1095\1072\1089\1091":"\1103\1082":reverseConcat1 n (drop 8 xs)- else [xs]), ("\1082\1086\1083", howConcat1Word n 1 us "\1080" "\1082\1086\1083\1080" xs),- ("\1082\1088\1110", if take 2 us == "\1079\1100" then "\1082\1088\1110\1079\1100":reverseConcat1 n (drop 2 us)- else if take 1 us == "\1084" then "\1082\1088\1110\1084":reverseConcat1 n (drop 1 us) else [xs]),- ("\1083\1077\1076", howConcat1Word n 2 us "\1074\1077" "\1083\1077\1076\1074\1077" xs),- ("\1083\1080\1096", howConcat1Word n 1 us "\1077" "\1083\1080\1096\1077" xs),- ("\1084\1072\1081", howConcat1Word n 2 us "\1078\1077" "\1084\1072\1081\1078\1077" xs),- ("\1084\1086\1074", if take 4 us == "\1073\1080\1090\1086" then "\1084\1086\1074\1073\1080\1090\1086":- reverseConcat1 n (drop 4 us)- else if take 2 us == "\1073\1080" then "\1084\1086\1074\1073\1080":reverseConcat1 n (drop 2 us)- else snd (howConcat1WordEntirely n "\1084\1086\1074" us)),- ("\1085\1072\1074", howConcat1Word n 3 us "\1110\1090\1100" "\1085\1072\1074\1110\1090\1100" xs),- ("\1085\1072\1089", howConcat1Word n 6 us "\1082\1110\1083\1100\1082\1080" "\1085\1072\1089\1082\1110\1083\1100\1082\1080" xs),- ("\1085\1072\1095", if take 4 us == "\1077\1073\1090\1086" then "\1085\1072\1095\1077\1073\1090\1086":- reverseConcat1 n (drop 4 us)- else if take 2 us == "\1077\1073" then "\1085\1072\1095\1077\1073":reverseConcat1 n (drop 2 us)- else if take 1 us == "\1077"- then "\1085\1072\1095\1077":reverseConcat1 n (drop 1 us) else [xs]),("\1085\1077\1074",- howConcat1Word n 2 us "\1078\1077" "\1085\1077\1074\1078\1077" xs),- ("\1085\1077\1079", if take 9 us == "\1072\1083\1077\1078\1085\1086\1074\1110\1076"- then "\1085\1077\1079\1072\1083\1077\1078\1085\1086\1074\1110\1076":reverseConcat1 n (drop 9 us) else- if take 13 us == "\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086"- then "\1085\1077\1079\1074\1072\1078\1072\1102\1095\1080\1085\1072\1090\1077\1097\1086":- reverseConcat1 n (drop 13 us)- else [xs]),("\1085\1077\1084", if take 6 us == "\1086\1074\1073\1080\1090\1086"- then "\1085\1077\1084\1086\1074\1073\1080\1090\1086":reverseConcat1 n (drop 6 us)- else if take 4 us == "\1086\1074\1073\1080" then "\1085\1077\1084\1086\1074\1073\1080":- reverseConcat1 n (drop 4 us) else- if take 2 us == "\1086\1074" then "\1085\1077\1084\1086\1074":reverseConcat1 n (drop 2 us) else [xs]),- ("\1085\1077\1085", if take 6 us == "\1072\1095\1077\1073\1090\1086"- then "\1085\1077\1085\1072\1095\1077\1073\1090\1086":reverseConcat1 n (drop 6 us)- else if take 3 us == "\1072\1095\1077" then "\1085\1077\1085\1072\1095\1077":- reverseConcat1 n (drop 3 us) else [xs]),- ("\1085\1077\1093", howConcat1Word n 2 us "\1072\1081" "\1085\1077\1093\1072\1081" xs),- ("\1085\1110\1073", if take 3 us == "\1080\1090\1086" then "\1085\1110\1073\1080\1090\1086":- reverseConcat1 n (drop 3 us) else- if take 1 us == "\1080" then "\1085\1110\1073\1080":reverseConcat1 n (drop 1 us) else [xs]),- howConcat1WordEntirely n "\1085\1110\1078" us,- ("\1086\1082\1088", howConcat1Word n 2 us "\1110\1084" "\1086\1082\1088\1110\1084" xs),- ("\1086\1090\1078", howConcat1Word n 1 us "\1077" "\1086\1090\1078\1077" xs),- ("\1086\1090\1086", howConcat1Word n 1 us "\1078" "\1086\1090\1086\1078" xs),- ("\1087\1086\1087", if take 6 us == "\1088\1080\1090\1077\1097\1086"- then "\1087\1086\1087\1088\1080":"\1090\1077":"\1097\1086":reverseConcat1 n (drop 6 us) else [xs]),- ("\1087\1088\1080", if take 4 us == "\1090\1086\1084\1091" then "\1087\1088\1080\1090\1086\1084\1091":- reverseConcat1 n (drop 4 us)- else if take 3 us == "\1090\1110\1084" then "\1087\1088\1080\1090\1110\1084":- reverseConcat1 n (drop 3 us) else- if take 5 us == "\1094\1100\1086\1084\1091" then "\1087\1088\1080\1094\1100\1086\1084\1091":- reverseConcat1 n (drop 5 us) else- if take 4 us == "\1095\1086\1084\1091" then "\1087\1088\1080\1095\1086\1084\1091":- reverseConcat1 n (drop 4 us) else- if take 3 us == "\1095\1110\1084" then "\1087\1088\1080\1095\1110\1084":reverseConcat1 n (drop 3 us)- else [xs]),- ("\1087\1088\1086", howConcat1Word n 2 us "\1090\1077" "\1087\1088\1086\1090\1077" xs),- ("\1087\1110\1089", if take 8 us == "\1083\1103\1090\1086\1075\1086\1103\1082"- then "\1087\1110\1089\1083\1103":"\1090\1086\1075\1086":"\1103\1082":reverseConcat1 n (drop 8 us)- else [xs]), ("\1089\1072\1084", howConcat1Word n 1 us "\1077" "\1089\1072\1084\1077" xs),- ("\1089\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1089\1077\1073\1090\1086" xs),- ("\1090\1072\1082", if take 1 us == "\1080" then "\1090\1072\1082\1080":reverseConcat1 n (drop 1 us) else- if take 3 us == "\1081\1072\1082" then "\1090\1072\1082":"\1103\1082":reverseConcat1 n (drop 3 us) else- if take 2 us == "\1097\1086" then "\1090\1072\1082":"\1097\1086":reverseConcat1 n (drop 2 us) else [xs]),- ("\1090\1080\1084", if take 8 us == "\1095\1072\1089\1086\1084\1081\1072\1082"- then "\1090\1080\1084":"\1095\1072\1089\1086\1084":"\1103\1082":reverseConcat1 n (drop 8 us) else [xs]),- ("\1090\1086\1073", howConcat1Word n 2 us "\1090\1086" "\1090\1086\1073\1090\1086" xs),- ("\1090\1086\1084", if take 3 us == "\1091\1097\1086" then "\1090\1086\1084\1091":"\1097\1086":- reverseConcat1 n (drop 3 us)- else if take 3 us == "\1091\1103\1082" then "\1090\1086\1084\1091":"\1103\1082":- reverseConcat1 n (drop 3 us) else [xs]),- ("\1090\1110\1083", howConcat1Word n 3 us "\1100\1082\1080" "\1090\1110\1083\1100\1082\1080" xs),- ("\1091\1079\1074", if take 6 us == "\1081\1072\1079\1082\1091\1079"- then "\1091":"\1079\1074\x02BC\1103\1079\1082\1091":"\1079":reverseConcat1 n (drop 6 us) else [xs]),- ("\1091\1084\1110", if take 8 us == "\1088\1091\1090\1086\1075\1086\1103\1082"- then "\1091":"\1084\1110\1088\1091":"\1090\1086\1075\1086":"\1103\1082":reverseConcat1 n (drop 8 us)- else [xs]), howConcat1WordEntirely n "\1093\1072\1081" us,("\1093\1086\1095", if take 2 us == "\1073\1080"- then "\1093\1086\1095":"\1073\1080":reverseConcat1 n (drop 2 us) else if take 2 us == "\1072\1073"- then "\1093\1086\1095\1072":"\1073":reverseConcat1 n (drop 2 us) else "\1093\1086\1095":[us]),- ("\1093\1110\1073", howConcat1Word n 1 us "\1072" "\1093\1110\1073\1072" xs),- ("\1094\1077\1073", howConcat1Word n 2 us "\1090\1086" "\1094\1077\1073\1090\1086" xs),- ("\1095\1077\1088", if take 6 us == "\1077\1079\1090\1077\1097\1086"- then "\1095\1077\1088\1077\1079":"\1090\1077":"\1097\1086":reverseConcat1 n (drop 6 us) else [xs]),- howConcat1WordEntirely n "\1097\1086\1073" us, ("\1103\1082\1073",- howConcat1Word n 1 us "\1080" "\1103\1082\1073\1080" xs),- ("\1103\1082\1088", howConcat1Word n 2 us "\1072\1079" "\1103\1082\1088\1072\1079" xs),- ("\1103\1082\1097", howConcat1Word n 1 us "\1086" "\1103\1082\1097\1086" xs)] ts- where (ts,us) = splitAt 3 xs--reverseConcat2 :: Int -> String -> String -> String -> [String]-reverseConcat2 n xs ts us =- getBFstLSorted' [xs] [("\1041\1110\1083", howConcat1Word n 1 us "\1103" "\1041\1110\1083\1103" xs),- ("\1042\1080\1082", howConcat1Word n 5 us "\1083\1102\1095\1085\1086" "\1042\1080\1082\1083\1102\1095\1085\1086" xs),- ("\1044\1072\1074", howConcat1Word n 2 us "\1072\1081" "\1044\1072\1074\1072\1081" xs),- ("\1047\1072\1090", howConcat1Word n 1 us "\1077" "\1047\1072\1090\1077" xs),- ("\1050\1086\1083", if take 1 us == "\1080" then "\1050\1086\1083\1080":reverseConcat1 n (drop 1 us)- else if take 1 us == "\1086" then "\1050\1086\1083\1086":reverseConcat1 n (drop 1 us) else [xs]),- ("\1051\1080\1096", howConcat1Word n 1 us "\1077" "\1051\1080\1096\1077" xs),- howConcat1WordEntirely n "\1053\1110\1078" us,- ("\1055\1110\1089", howConcat1Word n 2 us "\1083\1103" "\1055\1110\1089\1083\1103" xs),- ("\1057\1077\1088", howConcat1Word n 2 us "\1077\1076" "\1057\1077\1088\1077\1076" xs),- ("\1058\1110\1083", howConcat1Word n 3 us "\1100\1082\1080" "\1058\1110\1083\1100\1082\1080" xs),- ("\1073\1110\1083", howConcat1Word n 1 us "\1103" "\1073\1110\1083\1103" xs),- ("\1076\1072\1074", howConcat1Word n 2 us "\1072\1081" "\1076\1072\1074\1072\1081" xs),- ("\1079\1072\1090", howConcat1Word n 1 us "\1077" "\1079\1072\1090\1077" xs),- ("\1082\1086\1083", if take 1 us == "\1080" then "\1082\1086\1083\1080":reverseConcat1 n xs- else if take 1 us == "\1086" then "\1082\1086\1083\1086":reverseConcat1 n xs else [xs]),- ("\1083\1080\1096", howConcat1Word n 1 us "\1077" "\1083\1080\1096\1077" xs),- howConcat1WordEntirely n "\1085\1110\1078" us,- ("\1087\1077\1088", howConcat1Word n 2 us "\1077\1076" "\1087\1077\1088\1077\1076" xs),- ("\1087\1110\1089", howConcat1Word n 2 us "\1083\1103" "\1087\1110\1089\1083\1103" xs),- ("\1089\1077\1088", howConcat1Word n 2 us "\1077\1076" "\1089\1077\1088\1077\1076" xs)] ts--howConcat1Word :: Int -> Int -> String -> String -> String -> String -> [String]-howConcat1Word m n us us' us'' xs- | take n us == us' = us'':reverseConcat1 m (drop n us)- | otherwise = [xs]-{-# INLINE howConcat1Word #-}--howConcat1WordEntirely :: Int -> String -> String -> (String, [String])-howConcat1WordEntirely m ts us = (ts,ts:reverseConcat1 m us)-{-# INLINE howConcat1WordEntirely #-}
phonetic-languages-ukrainian-array.cabal view
@@ -2,33 +2,34 @@ -- further documentation, see http://haskell.org/cabal/users-guide/ name: phonetic-languages-ukrainian-array-version: 0.9.3.0-synopsis: Prepares Ukrainian text to be used as a phonetic language text-description: Applies needed minimal grammar connections so that the text afterwards can be processed by dobutokO-poetry or phonetic languages approach related programs. Uses arrays instead of vectors. Besides can be used to reverse many of the done concatenations.+version: 0.12.2.0+synopsis: Prepares Ukrainian text to be used as a PhLADiPreLiO text+description: Applies needed minimal grammar connections so that the text afterwards can be processed PhLADiPreLiO related programs. Besides can be used to reverse many of the done concatenations. homepage: https://hackage.haskell.org/package/phonetic-languages-ukrainian-array+bug-reports: https://github.com/Oleksandr-Zhabenko/phonetic-languages-ukrainian-array/issues license: MIT license-file: LICENSE-author: OleksandrZhabenko-maintainer: olexandr543@yahoo.com+author: Oleksandr Zhabenko+maintainer: oleksandr.zhabenko@yahoo.com copyright: Oleksandr Zhabenko category: Language,Game build-type: Simple-extra-source-files: ChangeLog.md+extra-source-files: ChangeLog.md, README.md cabal-version: >=1.10 library- exposed-modules: Phonetic.Languages.Ukrainian.PrepareText, Ukrainian.ReverseConcatenations+ exposed-modules: Phladiprelio.Ukrainian.PrepareText, Phladiprelio.Ukrainian.ReverseConcatenations -- other-modules:- other-extensions: CPP, BangPatterns- build-depends: base >=4.8 && <5, mmsyn2-array ==0.3.0.0, mmsyn5 ==0.5.1.0+ other-extensions: BangPatterns, NoImplicitPrelude+ build-depends: base >=4.13 && <5, mmsyn2-array ==0.3.1.1, intermediate-structures == 0.1.1.0 -- hs-source-dirs: default-language: Haskell2010 executable unconcatUkr main-is: Main.hs- other-modules: Ukrainian.ReverseConcatenations- other-extensions: CPP, BangPatterns- build-depends: base >=4.8 && <5, mmsyn2-array ==0.3.0.0, mmsyn5 ==0.5.1.0+ other-modules: Phladiprelio.Ukrainian.ReverseConcatenations+ other-extensions: BangPatterns, NoImplicitPrelude+ build-depends: base >=4.13 && <5, mmsyn2-array ==0.3.1.1, intermediate-structures == 0.1.1.0 ghc-options: -threaded -rtsopts- hs-source-dirs: ., Ukrainian+-- hs-source-dirs: default-language: Haskell2010