phladiprelio-ukrainian-simple 0.9.0.1 → 0.10.0.0
raw patch · 5 files changed
+100/−110 lines, 5 filesdep +phladiprelio-testsdep ~halfsplitdep ~rhythmic-sequencesPVP ok
version bump matches the API change (PVP)
Dependencies added: phladiprelio-tests
Dependency ranges changed: halfsplit, rhythmic-sequences
API changes (from Hackage documentation)
- Phladiprelio.Ukrainian.IO: generalF :: FilePath -> Int -> HashCorrections -> (Int8, [Int8]) -> Int -> Bool -> Int -> Bool -> Int8 -> (FilePath, Int) -> Bool -> [String] -> IO [String]
+ Phladiprelio.Ukrainian.IO: generalF :: (String, String) -> Int -> FilePath -> Int -> HashCorrections -> (Int8, [Int8]) -> Int -> Bool -> Int -> Bool -> Int8 -> (FilePath, Int) -> Bool -> String -> [String] -> IO [String]
Files
- CHANGELOG.md +8/−0
- Main.hs +39/−8
- Phladiprelio/Ukrainian/IO.hs +41/−99
- README.md +9/−0
- phladiprelio-ukrainian-simple.cabal +3/−3
CHANGELOG.md view
@@ -133,3 +133,11 @@ * Ninth version revised A. Fixed some documentation issues. +## 0.10.0.0 -- 2023-08-14++* Tenth version. Added the possibility for 2-syllable meter to print additional information about+points of incongruences of the line for +f group of command line arguments (using +f <filename for saving> <code> where code is in the range of (10..19) inclusively). +Added the possibility to work with multiline files as the input of the program on the per line basis using +m group+command line arguments. Moved the shared with phladiprelio-general-simple code to the new package +phladiprelio-tests to reduce code duplication. Updated the dependencies.+
Main.hs view
@@ -5,9 +5,9 @@ module Main where import GHC.Base-import GHC.Num (abs)+import GHC.Num (abs,(+),(-)) import Text.Read (readMaybe)-import System.IO (putStrLn)+import System.IO (putStrLn,readFile,print) import Rhythmicity.MarkerSeqs hiding (id) import Data.List hiding (foldr) import Data.Maybe (fromMaybe,catMaybes) @@ -39,16 +39,42 @@ numTest = fromMaybe 1 (readMaybe (concat . getB "-t" $ argsB)::Maybe Int) hashStep = fromMaybe 20 (readMaybe (concat . getB "+k" $ argsB)::Maybe Int) helpMessage = oneA "-h" argsA- argCs = catMaybes (fmap (readMaybeECG l) -- . (showB l lstW2:)- . getC "+a" $ argsC) filedata = getB "+f" argsB concurrently = oneA "-C" argsA+ multiline2 = getB "+m" argsB+ (fileread,lineNmb)+ | null multiline2 = ("",-1)+ | length multiline2 == 2 = (head multiline2, fromMaybe 1 (readMaybe (last multiline2)::Maybe Int))+ | otherwise = (head multiline2, 1)+ (arg3s,prestr,poststr) <- do + if lineNmb /= -1 then do+ txtFromFile <- readFile fileread+ let lns = lines txtFromFile+ ln0 = max 1 (min lineNmb (length lns))+ ln_1 + | ln0 == 1 = 0+ | otherwise = ln0 - 1+ ln1+ | ln0 == length lns = 0+ | otherwise = ln0 + 1+ lineF = lns !! (ln0 - 1)+ line_1F + | ln_1 == 0 = []+ | otherwise = lns !! (ln_1 - 1)+ line1F+ | ln1 == 0 = []+ | otherwise = lns !! (ln1 - 1)+ return $ (words lineF, line_1F,line1F)+ else return (arg2s, [], [])+ let (filesave,codesave) | null filedata = ("",-1) | length filedata == 2 = (head filedata, fromMaybe 0 (readMaybe (last filedata)::Maybe Int)) | otherwise = (head filedata,0)- ll = take maxNumWords . (if prepare then id else words . mconcat . prepareText . unwords) $ arg2s+ ll = take maxNumWords . (if prepare then id else words . mconcat . prepareText . unwords) $ arg3s l = length ll+ argCs = catMaybes (fmap (readMaybeECG l) -- . (showB l lstW2:)+ . getC "+a" $ argsC) !perms | not (null argCBs) = filterGeneralConv l argCBs . genPermutationsL $ l | null argCs = genPermutationsL l@@ -72,7 +98,9 @@ putStrLn "" putStrLn "-p \t— if present the minimal grammar transformations (appending and prepending the dependent parts) are not applied. Can be useful also if the text is analyzed as a Ukrainian transcription of text in some other language." putStrLn ""- putStrLn "+f \t— if present with two arguments specifies the file to which the output information should be appended and the mode of appending (which parts to write). The default value if the secodnd parameter is 0 or not element of [1..4] is just the resulting String option. If the second parameter is 1 then the sequential number and the text are written; if it is 2 then the estimation value and the string are written; if it is 3 then the full information is written i. e. number, string and estimation; if it is 4 then the number and estimation (no string). "+ putStrLn "+f \t— if present with two arguments specifies the file to which the output information should be appended and the mode of appending (which parts to write). The default value if the secodnd parameter is 0 or not element of [1,2,3,4,10,11,12,13,14,15,16,17,18,19] is just the resulting String option. If the second parameter is 1 then the sequential number and the text are written; if it is 2 then the estimation value and the string are written; if it is 3 then the full information is written i. e. number, string and estimation; if it is 4 then the number and estimation (no string)."+ putStrLn "The second arguments greater or equal to 10 take effect only if the meter consists of two syllables (in case of \"+r 21\" command line options given). If it is 10 in such a case then before appending the line option itself to the given file there is hashes information for this line option displayed. If it is 11 — the same hashes information is displayed before processing as for 1. If it is 12 — the same hashes information is displayed before processing as for 2 and so on for 13, 14. If it is 15 up to 19 — it is analogically to the the 10–14 but the hashes information is not only printed on the screen, but appended to the file specified. These values are intended to test the interesting hypothesis about where the pauses can occur. For more information on the hypothesis, see: "+ putStrLn "https://www.academia.edu/105067761/Why_some_lines_are_easy_to_pronounce_and_others_are_not_or_prosodic_unpredictability_as_a_characteristic_of_text" putStrLn "" putStrLn "+a ... -a \t— if present contains a group of constraints for PhLADiPreLiO. For more information, see: " putStrLn "https://oleksandr-zhabenko.github.io/uk/rhythmicity/PhLADiPreLiO.Eng.21.html#constraints in English or in Ukrainian: "@@ -96,10 +124,13 @@ putStrLn "" putStrLn "+x \t— If specified with the further natural number then means that instead of maximum 7 words or their concatenations that can be analysed together as a line there will be taken the specified number here or 9 if the number is greater than 8. More words leads to more computations, therefore, please, use with this caution in mind. It can be useful mostly for the cases with the additional constraints specified (+a ... -a or +b ... -b groups, see above)." putStrLn ""- else generalF fileDu numTest hc grpp sylD descending hashStep emptyline splitting (filesave, codesave) concurrently variants1 >> return ()+ putStrLn "+m \t— If present followed with two arguments — the name of the file to be used for reading data for multiline processment and the second one — the number of line to be processed. The numeration of the lines in the file for the phladiprelioUkr program here starts from 1 (so, it is: 1, 2, 3, 4,.. etc). The program then uses instead of text the specified line from the file specified here and prints information about its previous and next lines (if available)."+ putStrLn ""+ else generalF (prestr, poststr) lineNmb fileDu numTest hc grpp sylD descending hashStep emptyline splitting (filesave, codesave) concurrently (unwords arg3s) variants1 >> return () + bSpecs :: CLSpecifications-bSpecs = (zip ["+c","+d","+k","+r","+s","-t","+w","+x"] . cycle $ [1]) `mappend` [("+f",2)] +bSpecs = (zip ["+c","+d","+k","+r","+s","-t","+w","+x"] . cycle $ [1]) `mappend` [("+f",2),("+m",2)] aSpecs :: CLSpecifications aSpecs = zip ["-h", "+l", "+n","-p", "-C"] . cycle $ [0]
Phladiprelio/Ukrainian/IO.hs view
@@ -2,6 +2,7 @@ module Phladiprelio.Ukrainian.IO where +import GHC.Arr import GHC.Base import GHC.Num (Integer,(+),(-),(*)) import GHC.Real (fromIntegral,(/),quot,rem,quotRem)@@ -9,7 +10,7 @@ import Text.Show (Show(..)) import Text.Read (readMaybe) import Data.Char (isDigit)-import System.IO (putStrLn, FilePath,stdout,hSetNewlineMode,universalNewlineMode,getLine,appendFile)+import System.IO (putStrLn, FilePath,stdout,hSetNewlineMode,universalNewlineMode,getLine,appendFile,print) import Rhythmicity.MarkerSeqs hiding (id) import Data.List hiding (foldr) import Data.Maybe (isNothing,fromJust) @@ -24,11 +25,13 @@ import Phladiprelio.Halfsplit import System.Directory (readable,writable,getPermissions,Permissions(..)) import Data.ReversedScientific-import Data.Either import Control.Concurrent.Async (mapConcurrently)+import Phladiprelio.Tests generalF- :: FilePath + :: (String, String) -- ^ If the next element is not equal to -1, then the prepending and appending lines to be displayed. Used basically for working with the multiline textual input data.+ -> Int -- ^ The number of the line in the file to be read the lines from. If equal to -1 then neither reading from the file is done nor the first argument influences the processment results.+ -> FilePath -- ^ The file to read the sound representation durations from. -> Int -> HashCorrections -> (Int8,[Int8]) @@ -39,11 +42,12 @@ -> Int8 -> (FilePath, Int) -> Bool -- ^ Whether to run tests concurrently or not. 'True' corresponds to concurrent execution that can speed up the getting results but use more resources.+ -> String -- ^ An initial string to be analysed. -> [String] -> IO [String]-generalF file numTest hc (grps,mxms) k descending hashStep emptyline splitting (fs,code) concurrently universalSet@(u1:u2:us) = do+generalF (prestr, poststr) lineNmb file numTest hc (grps,mxms) k descending hashStep emptyline splitting (fs,code) concurrently initstr universalSet@(u1:u2:us) = do syllableDurationsDs <- readSyllableDurations file- let syllN = countSyll . concat . take 1 $ universalSet+ let syllN = countSyll initstr -- universalSet = map unwords . permutations . words $ rs f syllableDurationsDs grps mxms = sum . countHashes2G hashStep hc grps mxms . mconcat . (if null file then case k of { 1 -> syllableDurationsD; 2 -> syllableDurationsD2; 3 -> syllableDurationsD3; 4 -> syllableDurationsD4} @@ -68,100 +72,39 @@ _ <- mapM putStrLn strOutput let l1 = length sRepresent if code == -1 - then return strOutput- else parseLineNumber l1 >>= \num -> do+ then if lineNmb == -1 then return strOutput+ else do + print23 prestr poststr 1 [initstr]+ return strOutput+ else do + print23 prestr poststr 1 [initstr]+ parseLineNumber l1 >>= \num -> do permiss <- getPermissions fs let writ = writable permiss readab = readable permiss- if writ && readab then appendFile fs (flip outputSel code . head . filter (\(S k _ _) -> k == num) $ sRepresent)+ if writ && readab then do+ let lineOption = head . filter (\(S k _ ts) -> k == num) $ sRepresent+ textP = (\(S _ _ ts) -> ts) lineOption+ sylls = createSyllablesUkrS textP+ if code >= 10 && code <= 19 && grps == 2+ then do+ let structData = (if null file then case k of { 1 -> syllableDurationsD; 2 -> syllableDurationsD2; 3 -> syllableDurationsD3; 4 -> syllableDurationsD4} else if length syllableDurationsDs >= k then syllableDurationsDs !! (k - 1) else syllableDurationsD2) . createSyllablesUkrS . (\(S _ _ ts) -> ts) $ lineOption+ (breaks,rs) = showZerosFor2Period structData syllN (showS8) sylls+ putStrLn textP+ putStrLn breaks+ putStrLn . show $ rs+ appendFile fs ((if code >= 15 then (show rs `mappend` "\n" `mappend` breaks `mappend` "\n") else "") `mappend` outputSel lineOption code)+ else appendFile fs (outputSel lineOption code) else error "The specified file cannot be used for appending the text! Please, specify another file!" return []- where sel x - | x == 1 || x < 0 || x > 179 = []- | x == 0 || x == 4 = [[1],[2,1],[3,2],[4,3,2],[5,4,3],[6,5,4,3,2]] -- all cases are present: 2, 3, 4, 5, 6, 7. Therefore, the slowest ones.- | x == 2 || x == 5 = [[1],[2],[3],[4,3],[5,4],[6,5,4]]- | x == 7 = [[0],[1,0],[1,0],[1,0],[1,0],[1,0]]- | x == 8 = [[0],[1,0],[1,0],[2,1,0],[2,1,0],[2,1,0]]- | x == 9 = [[0],[1,0],[1,0],[2,1,0],[3,2,1,0],[3,2,1,0]]------------------------------------------------------------------------------- | x >= 20 && x <= 26 && x /= 21 = [[1]] -- at least 7 is omitted, but probably 6, or even 5, or even 4, or even 3. 2 is however present.- | x >= 27 && x <= 29 = [[0]]- | x == 30 || x == 34 = [[1],[2,1]]- | x == 32 || x == 35 = [[1],[2]]- | x >= 37 && x <= 39 = [[0],[1,0]]- | x == 40 || x == 44 = [[1],[2,1],[3,2]]- | x == 42 || x == 45 = [[1],[2],[3]]- | x >= 47 && x <= 49 = [[0],[1,0],[1,0]]- | x == 50 || x == 54 = [[1],[2,1],[3,2],[4,3,2]]- | x == 52 || x == 55 = [[1],[2],[3],[4,3]]- | x == 57 = [[0],[1,0],[1,0],[1,0]]- | x == 58 || x == 59 = [[0],[1,0],[1,0],[2,1,0]]- | x == 60 || x == 64 = [[1],[2,1],[3,2],[4,3,2],[5,4,3]]- | x == 62 || x == 65 = [[1],[2],[3],[4,3],[5,4]]- | x == 67 = [[0],[1,0],[1,0],[1,0],[1,0]]- | x == 68 = [[0],[1,0],[1,0],[2,1,0],[2,1,0]]- | x == 69 = [[0],[1,0],[1,0],[2,1,0],[3,2,1,0]]------------------------------------------------------------------- | x == 70 || x == 74 = [[2,1],[3,2],[4,3,2],[5,4,3],[6,5,4,3,2]] -- at least 2 is omitted, but probably 3 and even 4. 5, 6 and 7 are present.- | x == 72 || x == 75 = [[2],[3],[4,3],[5,4],[6,5,4]]- | x == 77 = [[1,0],[1,0],[1,0],[1,0],[1,0]]- | x == 78 = [[1,0],[1,0],[2,1,0],[2,1,0],[2,1,0]]- | x == 79 = [[1,0],[1,0],[2,1,0],[3,2,1,0],[3,2,1,0]]- | x == 80 || x == 84 = [[3,2],[4,3,2],[5,4,3],[6,5,4,3,2]]- | x == 82 || x == 85 = [[3],[4,3],[5,4],[6,5,4]]- | x == 87 = [[1,0],[1,0],[1,0],[1,0]]- | x == 88 = [[1,0],[2,1,0],[2,1,0],[2,1,0]]- | x == 89 = [[1,0],[2,1,0],[3,2,1,0],[3,2,1,0]]- | x == 90 || x == 94 = [[4,3,2],[5,4,3],[6,5,4,3,2]]- | x == 92 || x == 95 = [[4,3],[5,4],[6,5,4]]- | x == 97 = [[1,0],[1,0],[1,0]]- | x == 98 = [[2,1,0],[2,1,0],[2,1,0]]- | x == 99 = [[2,1,0],[3,2,1,0],[3,2,1,0]]------------------------------------------------------------------------------------- | x == 100 || x == 104 = [[1],[2,1],[4,3,2],[6,5,4,3,2]] -- 4 and 6 are omitted, just present the ones from: 2, 3, 5, 7.- | x == 102 || x == 105 = [[1],[2],[4,3],[6,5,4]]- | x == 107 = [[0],[1,0],[1,0],[1,0]]- | x == 108 = [[0],[1,0],[2,1,0],[2,1,0]]- | x == 109 = [[0],[1,0],[2,1,0],[3,2,1,0]]------------------------------------------------------------------------------- | x == 150 || x == 154 = [[1],[2,1],[4,3,2]] -- 4, 6, 7 are omitted but 2, 3, 5 are present.- | x == 152 || x == 155 = [[1],[2],[4,3]]- | x == 157 = [[0],[1,0],[1,0]]- | x == 158 || x == 159 = [[0],[1,0],[2,1,0]]------------------------------------------------------------------- | x == 170 || x == 174 = [[2,1],[4,3,2],[6,5,4,3,2]] -- just 3, 5 and 7 are present- | x == 172 || x == 175 = [[2],[4,3],[6,5,4]]- | x == 177 = [[1,0],[1,0],[1,0]]- | x == 178 = [[1,0],[2,1,0],[2,1,0]]- | x == 179 = [[1,0],[2,1,0],[3,2,1,0]]----------------------------------------------------------------------------------- - | otherwise = [[1],[1],[2,1],[3,2,1],[3,2],[4,3,2]]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- sel2 y - | y == 1 || y < 0 || y > 179 = []- | (rem y 10 `elem` [1,3,6]) || y >= 0 && y <= 9 = [2..7]- | y >= 20 && y <= 69 = [2..toEnum (y `quot` 10)]- | y >= 70 && y <= 99 = [toEnum (y `quot` 10) - 4..7]- | y >= 100 && y <= 109 = [2,3,5,7]- | y >= 150 && y <= 159 = [2,3,5]- | y >= 170 && y <= 179 = [3,5,7]- | otherwise = [2..7]- minMax11ByCList :: Ord a => (a -> a -> Ordering) -> [a] -> (a, a) -- Is rewritten from the 'Data.MinMax.Preconditions.minMax11ByC' from @subG@ package.- minMax11ByCList g xs@(x:y:ys) = foldr f (if x > y then (y, x) else (x, y)) ys- where f z (x,y)- | g z x == LT = (z,y)- | g z y == GT = (x,z)- | otherwise = (x,y)- minMax11ByCList _ _ = undefined -- Is not intended to be used for lists with less than two elements.- jjj kk = let (q1,r1) = quotRem kk (if kk < 0 then -10 else 10) in jjj' q1 r1 emptyline- jjj' q1 r1 emptyline- | r1 == (-1) || r1 == (-3) = -10*q1 + (if emptyline then -5 else r1)- | r1 == 1 || r1 == 3 = 10*q1 + (if emptyline then 5 else r1)- | r1 < 0 = -10*q1 + (if emptyline then -4 else r1)- | otherwise = 10*q1 + (if emptyline then 4 else r1)-generalF _ _ _ _ _ _ _ _ _ _ _ [u1] = mapM putStrLn [u1] >> return [u1]-generalF _ _ _ _ _ _ _ _ _ _ _ _ = let strOutput = ["You have specified the data and constraints on it that lead to no further possible options.", "Please, specify another data and constraints."] in mapM putStrLn strOutput >> return strOutput+ where jjj kk = let (q1,r1) = quotRem kk (if kk < 0 then -10 else 10) in jjj' q1 r1 emptyline+ jjj' q1 r1 emptyline+ | r1 == (-1) || r1 == (-3) = -10*q1 + (if emptyline then -5 else r1)+ | r1 == 1 || r1 == 3 = 10*q1 + (if emptyline then 5 else r1)+ | r1 < 0 = -10*q1 + (if emptyline then -4 else r1)+ | otherwise = 10*q1 + (if emptyline then 4 else r1)+generalF _ _ _ _ _ _ _ _ _ _ _ _ _ _ [u1] = mapM putStrLn [u1] >> return [u1]+generalF _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ = let strOutput = ["You have specified the data and constraints on it that lead to no further possible options.", "Please, specify another data and constraints."] in mapM putStrLn strOutput >> return strOutput data PhladiprelioUkr = S Int Integer String deriving Eq @@ -185,11 +128,10 @@ outputSel :: PhladiprelioUkr -> Int -> String outputSel (S x1 y1 ts) code | code < 0 = []- | code == 0 = ts `mappend` "\n"- | code == 1 = intercalate " " [show x1, ts] `mappend` "\n"- | code == 2 = intercalate " " [show y1, ts] `mappend` "\n"- | code == 3 = intercalate " " [show x1, ts, show y1] `mappend` "\n"- | code == 4 = intercalate " " [show x1, show y1] `mappend` "\n"+ | code == 1 || code == 11 || code == 16 = intercalate " " [show x1, ts] `mappend` "\n"+ | code == 2 || code == 12 || code == 17 = intercalate " " [show y1, ts] `mappend` "\n"+ | code == 3 || code == 13 || code == 18 = intercalate " " [show x1, ts, show y1] `mappend` "\n"+ | code == 4 || code == 14 || code == 19 = intercalate " " [show x1, show y1] `mappend` "\n" | otherwise = ts `mappend` "\n" parseLineNumber :: Int -> IO Int
README.md view
@@ -22,6 +22,13 @@ [New implementation](https://oleksandr-zhabenko.github.io/uk/rhythmicity/phladiprelioEng.7.pdf) +The examples of the using the new functionality in the 0.10.0.0 version is in two short videos by+the links below:++[+f <filename> <code> mode additions](https://www.facebook.com/Oleksandr.S.Zhabenko/videos/593118766229253/)++[+m <another filename> <another code> mode — new one in this version](https://www.facebook.com/Oleksandr.S.Zhabenko/videos/325188039864718/)+ Since the version 0.7.0.0 the default mode for non-tests output is in two-column. This improves the UI / UX for the end user. Besides there is the possibility to write the result to a file. @@ -77,6 +84,8 @@ On the 30/07/2023 there is the Birthday of Vico Kok and also International Friendship Day. Therefore, the release versions 0.9.0.0 and 0.9.0.1 are devoted to Vico.++The version 0.10.0.0 is devoted to [Enzo Kok](https://enzokok.nl) whose Birthday is on the 14th of August. If you would like to share some financial support, please, contact the mentioned foundation using the URL:
phladiprelio-ukrainian-simple.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: phladiprelio-ukrainian-simple-version: 0.9.0.1+version: 0.10.0.0 -- A short (one-line) description of the package. synopsis: A PhLADiPreLiO implementation for Ukrainian that uses hashes and asynchronous concurrency.@@ -28,7 +28,7 @@ -- LANGUAGE extensions used by modules in this package. other-extensions: NoImplicitPrelude, BangPatterns- build-depends: base >=4.13 && <5, rhythmic-sequences ==0.3.0.0, ukrainian-phonetics-basic-array ==0.7.0.0, phonetic-languages-ukrainian-array ==0.10.0.0, phladiprelio-ukrainian-shared ==0.1.0.0, cli-arguments ==0.7.0.0, phonetic-languages-permutations-array ==0.4.0.0, phonetic-languages-constraints-array ==0.7.3.0, phonetic-languages-simplified-base ==0.7.1.0, halfsplit ==0.2.0.0, directory >=1.3.4.0 && <2, rev-scientific ==0.2.1.0, async >=2.2.2 && <3+ build-depends: base >=4.13 && <5, rhythmic-sequences ==0.4.0.0, ukrainian-phonetics-basic-array ==0.7.0.0, phonetic-languages-ukrainian-array ==0.10.0.0, phladiprelio-ukrainian-shared ==0.1.0.0, cli-arguments ==0.7.0.0, phonetic-languages-permutations-array ==0.4.0.0, phonetic-languages-constraints-array ==0.7.3.0, phonetic-languages-simplified-base ==0.7.1.0, halfsplit ==0.3.0.0, directory >=1.3.4.0 && <2, rev-scientific ==0.2.1.0, async >=2.2.2 && <3, phladiprelio-tests ==0.1.0.0 hs-source-dirs: . default-language: Haskell2010 @@ -40,7 +40,7 @@ ghc-options: -threaded -rtsopts -- LANGUAGE extensions used by modules in this package. other-extensions: NoImplicitPrelude, BangPatterns- build-depends: base >=4.13 && <5, rhythmic-sequences ==0.3.0.0, ukrainian-phonetics-basic-array ==0.7.0.0, phonetic-languages-ukrainian-array ==0.10.0.0, phladiprelio-ukrainian-shared ==0.1.0.0, cli-arguments ==0.7.0.0, phonetic-languages-permutations-array ==0.4.0.0, phonetic-languages-constraints-array ==0.7.3.0, phonetic-languages-simplified-base ==0.7.1.0, halfsplit ==0.2.0.0, directory >=1.3.4.0 && <2, rev-scientific ==0.2.1.0, async >= 2.2.2 && <3+ build-depends: base >=4.13 && <5, rhythmic-sequences ==0.4.0.0, ukrainian-phonetics-basic-array ==0.7.0.0, phonetic-languages-ukrainian-array ==0.10.0.0, phladiprelio-ukrainian-shared ==0.1.0.0, cli-arguments ==0.7.0.0, phonetic-languages-permutations-array ==0.4.0.0, phonetic-languages-constraints-array ==0.7.3.0, phonetic-languages-simplified-base ==0.7.1.0, halfsplit ==0.3.0.0, directory >=1.3.4.0 && <2, rev-scientific ==0.2.1.0, async >= 2.2.2 && <3, phladiprelio-tests ==0.1.0.0 hs-source-dirs: . default-language: Haskell2010