{-# OPTIONS_GHC -threaded -rtsopts #-}
{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE BangPatterns #-}

-- |
-- Module      :  Phonetic.Languages.Simple
-- Copyright   :  (c) OleksandrZhabenko 2020-2021
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- The library functions for the lineVariantsG3 executable. Since 0.4.0.0 version it supports printing of the informational
-- messages both in English and Ukrainian. Since the 0.13.0.0 version there is the possibility to provide custom durations
-- instead of the default predefined ones.

module Phonetic.Languages.Simple where

import Phonetic.Languages.Parsing
import Numeric
import Languages.UniquenessPeriods.Array.Constraints.Encoded (decodeLConstraints,readMaybeECG)
import GHC.Arr
import Phonetic.Languages.Simplified.DataG.Base
import Phonetic.Languages.Filters (unsafeSwapVecIWithMaxI)
import Phonetic.Languages.Simplified.StrictVG.Base
import Data.Char (isDigit,isAlpha,isLetter)
import qualified Data.List  as L (span,sort,zip4,isPrefixOf,nub)
import Phonetic.Languages.Array.Ukrainian.PropertiesSyllablesG2Common
import Phonetic.Languages.Simplified.Array.Ukrainian.FuncRep2RelatedG2
import Phonetic.Languages.Permutations.Arr
import Phonetic.Languages.Permutations.ArrMini
import Data.SubG hiding (takeWhile,dropWhile)
import Data.Maybe
import Data.MinMax.Preconditions
import Text.Read (readMaybe)
import Phonetic.Languages.Simplified.DeEnCoding
import Phonetic.Languages.Simplified.SimpleConstraints
import Interpreter.StringConversion
import Melodics.Ukrainian.ArrInt8 (Sound8)
import Phonetic.Languages.Ukrainian.PrepareText (prepareTuneTextMN,isSpC,isUkrainianL)
import Phonetic.Languages.Simplified.Array.Ukrainian.ReadProperties

forMultiplePropertiesF :: [String] -> [(String,[String])]
forMultiplePropertiesF :: [String] -> [(String, [String])]
forMultiplePropertiesF (String
xs:[String]
xss)
 | (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Char -> Bool
isAlpha String
xs = (String
xs,[String]
yss)(String, [String]) -> [(String, [String])] -> [(String, [String])]
forall a. a -> [a] -> [a]
:[String] -> [(String, [String])]
forMultiplePropertiesF [String]
zss
 | Bool
otherwise = []
     where l :: Int
l = [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> ([String] -> [String]) -> [String] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isDigit) ([String] -> Int) -> [String] -> Int
forall a b. (a -> b) -> a -> b
$ [String]
xss
           ([String]
yss,[String]
zss) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
l [String]
xss
forMultiplePropertiesF [String]
_ = []

{-| Is used to organize the most complex processment -- for multiple sources and probably recursively.
-}
generalProc3G
 :: FilePath -- ^ Whether to use the own provided durations from the file specified here.
 -> Bool -- ^ Whether to use just pairwise permutations, or the full universal set.
 -> [String]
 -> String -- ^ If empty, the function is just 'generalProc2G' with the arguments starting from the first 'Bool' here.
 -> Int
 -> Bool
 -> Bool
 -> FilePath
 -> Bool
 -> Bool
 -> [String]
 -> Coeffs2
 -> Coeffs2
 -> [String]
 -> Bool
 -> IO ()
generalProc3G :: String
-> Bool
-> [String]
-> String
-> Int
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc3G String
fileDu Bool
pairwisePermutations [String]
textProcessmentFss String
textProcessment0 Int
textProcessment1 Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW = do
  [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs <- String -> IO [[[[Sound8]]] -> [[Double]]]
readSyllableDurations String
fileDu
  [[[[Sound8]]] -> [[Double]]]
-> Bool
-> [String]
-> String
-> Int
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
forall (t :: * -> *) (t :: * -> *) a a.
(Foldable t, Foldable t, Eq a, Num a) =>
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> t String
-> t a
-> a
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc3G' [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations [String]
textProcessmentFss String
textProcessment0 Int
textProcessment1 Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW
    where generalProc3G' :: [[[[Sound8]]] -> [[Double]]]
-> Bool
-> t String
-> t a
-> a
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc3G' [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations t String
textProcessmentFss t a
textProcessment0 a
textProcessment1 Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW
            | t a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null t a
textProcessment0 = [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc2G [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW
            | t String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null t String
textProcessmentFss = (Integer -> IO ()) -> [Integer] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\Integer
_ -> do  -- interactive training mode
                 String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
7 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian
                 String
lineA <- IO String
getLine
                 [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc2G [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 ((String -> Bool) -> String -> [String] -> [String]
fullArgsConvertTextualSimple String -> Bool
mightNotUkrWord String
lineA [String]
args0) Coeffs2
coeffs Coeffs2
coeffsWX ((String -> Bool) -> String -> [String] -> [String]
fullArgsConvertTextualSimple String -> Bool
mightNotUkrWord String
lineA [String]
args) Bool
lstW) [Integer
0..]
            | Bool
otherwise =
                 (String -> IO ()) -> t String -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\String
js -> do
                  let !kss :: [String]
kss = String -> [String]
lines String
js
                  if Bool
pairwisePermutations then do
                    let !wss :: [String]
wss
                         | a
textProcessment1 a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a
10,a
20,a
30,a
40,a
50,a
60,a
70,a
80,a
90] = [String]
kss
                         | Bool
otherwise = Int -> Int -> String -> [String]
prepareTuneTextMN Int
m Int
1 (String -> [String])
-> ([String] -> String) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
kss
                    (String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\String
tss -> [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc2G [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 ((String -> Bool) -> String -> [String] -> [String]
fullArgsConvertTextualSimple String -> Bool
mightNotUkrWord String
tss [String]
args0) Coeffs2
coeffs Coeffs2
coeffsWX
                      ((String -> Bool) -> String -> [String] -> [String]
fullArgsConvertTextualSimple String -> Bool
mightNotUkrWord String
tss [String]
args) Bool
lstW) [String]
wss
                  else do
                    let !wss :: [String]
wss
                         | a
textProcessment1 a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a
20,a
30,a
40,a
50,a
60,a
70] = [String]
kss
                         | Bool
otherwise = Int -> Int -> String -> [String]
prepareTuneTextMN (if a
textProcessment1 a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a
21,a
31,a
41,a
51,a
61] then Int
m else Int
7) Int
1 (String -> [String])
-> ([String] -> String) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
kss
                    (String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\String
tss -> [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc2G [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian String
toFileMode1 Bool
interactiveP Bool
jstL0 ((String -> Bool) -> String -> [String] -> [String]
fullArgsConvertTextualSimple String -> Bool
mightNotUkrWord String
tss [String]
args0) Coeffs2
coeffs Coeffs2
coeffsWX
                      ((String -> Bool) -> String -> [String] -> [String]
fullArgsConvertTextualSimple String -> Bool
mightNotUkrWord String
tss [String]
args) Bool
lstW) [String]
wss) t String
textProcessmentFss
          m :: Int
m = if Int
textProcessment1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
10 Bool -> Bool -> Bool
|| Int
textProcessment1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
11 then Int
10 else Int -> Int -> Int
forall a. Integral a => a -> a -> a
quot Int
textProcessment1 Int
10

{-| If 'False' then it might be the Ukrainian word in the phonetic languages approach. If 'True', it is not.
Is an example of the predicate inside the 'fullArgsConvertTextual' function for the Ukrainian language.
-}
mightNotUkrWord :: String -> Bool
mightNotUkrWord :: String -> Bool
mightNotUkrWord String
xs
 | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
ts Bool -> Bool -> Bool
|| String
ts String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"-" = Bool
True
 | (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Char -> Bool
isAlpha String
us = Bool
True
 | String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ((Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isUkrainianN) String
us) = Bool
False
 | Bool
otherwise = Bool
True
     where (String
ts,String
us) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
L.span Char -> Bool
isUkrainianN String
xs
{-# INLINE mightNotUkrWord #-}

-- | Is taken from the @mmsyn6ukr@ package version 0.8.1.0 so that the amount of dependencies are reduced (and was slightly modified).
isUkrainianN :: Char -> Bool
isUkrainianN Char
x = Char -> Bool
isUkrainianL Char
x Bool -> Bool -> Bool
|| Char -> Bool
isSpC Char
x

{-|
@ since 0.3.0.0
Is used to do general processment.
@ since 0.5.0.0
The meaning of the first command line argument (and 'Coeffs2' here everywhere in the module)
depends on the 'String' argument -- whether it starts with \'w\', \'x\' or otherwise. In the first case it represents
the k1 and k2 coefficients (default ones equal to 2.0 and 0.125) for the functions from the Rhythmicity.TwoFourth module.
Otherwise, it is used for the functions to specify the level of emphasizing the two-based and three-based periods
(the default values here are 1.0 both).
@ since 0.6.0.0
Changed the arguments signing so that capital letters changed to the small ones, double ++ changed to just singular +.
@ since 0.9.0.0
Added a new argument to control whether to use interactive recursive mode.

-}
generalProc2G
 :: [[[[Sound8]]] -> [[Double]]] -- ^ Whether to use the own provided durations.
 -> Bool -- ^ Whether to use just pairwise permutations, or the full universal set.
 -> Bool
 -> Bool
 -> FilePath
 -> Bool
 -> Bool
 -> [String]
 -> Coeffs2
 -> Coeffs2
 -> [String]
 -> Bool
 -> IO ()
generalProc2G :: [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc2G [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian String
toFile1 Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW2
 | [String] -> Bool
variations [String]
args = do
    let !zsss :: [[String]]
zsss = [String] -> [[String]]
transformToVariations [String]
args
    [[String]] -> IO ()
forall a. Show a => a -> IO ()
print [[String]]
zsss
    [String]
variantsG <- ([String] -> IO String) -> [[String]] -> IO [String]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\[String]
xss -> [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
xss Bool
lstW2) [[String]]
zsss
    (if Bool
recursiveMode then [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (String -> String)
-> [String]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX String -> String
forall a. a -> a
id [String]
variantsG [String]
args Bool
lstW2
     else Bool -> (String -> String) -> [String] -> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian String -> String
forall a. a -> a
id [String]
variantsG) IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \String
rs ->
      case String
toFile1 of
       String
"" -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
       ~String
fileName -> String -> String -> IO ()
appendFile String
fileName (String
rs String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding)
 | Bool
otherwise = [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW2 IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
    \String
rs ->
      case String
toFile1 of
       String
"" -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
       ~String
fileName -> String -> String -> IO ()
appendFile String
fileName (String
rs String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding)

-- |
-- @ since 0.3.0.0 The result is not 'IO' (), but 'IO' 'String'. The type also changed generally.
generalProc2
 :: [[[[Sound8]]] -> [[Double]]] -- ^ Whether to use the own provided durations.
 -> Bool -- ^ Whether to use just pairwise permutations, or the full universal set.
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> [String]
 -> Coeffs2
 -> Coeffs2
 -> [String]
 -> Bool
 -> IO String
generalProc2 :: [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [String]
args Bool
lstW2 = do
  let !argMss :: [(String, [String])]
argMss = Int -> [(String, [String])] -> [(String, [String])]
forall a. Int -> [a] -> [a]
take Int
5 ([(String, [String])] -> [(String, [String])])
-> ([String] -> [(String, [String])])
-> [String]
-> [(String, [String])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, [String]) -> Bool)
-> [(String, [String])] -> [(String, [String])]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> ((String, [String]) -> Bool) -> (String, [String]) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, [String]) -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([(String, [String])] -> [(String, [String])])
-> ([String] -> [(String, [String])])
-> [String]
-> [(String, [String])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [(String, [String])]
forMultiplePropertiesF ([String] -> [(String, [String])])
-> ([String] -> [String]) -> [String] -> [(String, [String])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"+m") ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"-m") ([String] -> [(String, [String])])
-> [String] -> [(String, [String])]
forall a b. (a -> b) -> a -> b
$ [String]
args0
  if [(String, [String])] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(String, [String])]
argMss then do
   let (![String]
numericArgs,![String]
textualArgs) = (String -> Bool) -> [String] -> ([String], [String])
forall a. (a -> Bool) -> [a] -> ([a], [a])
L.span ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isDigit) ([String] -> ([String], [String]))
-> [String] -> ([String], [String])
forall a b. (a -> b) -> a -> b
$ [String]
args
       !xs :: String
xs = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> String -> [String]
prepareTuneTextMN (if Bool
pairwisePermutations then Int
10 else Int
7) Int
1 (String -> [String])
-> ([String] -> String) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
textualArgs
       !l :: Int
l = [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
xs
       !argCs :: [EncodedCnstrs]
argCs = [Maybe EncodedCnstrs] -> [EncodedCnstrs]
forall a. [Maybe a] -> [a]
catMaybes ((String -> Maybe EncodedCnstrs)
-> [String] -> [Maybe EncodedCnstrs]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> String -> Maybe EncodedCnstrs
readMaybeECG (Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) ([String] -> [Maybe EncodedCnstrs])
-> ([String] -> [String]) -> [String] -> [Maybe EncodedCnstrs]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool -> String
showB Int
l Bool
lstW2String -> [String] -> [String]
forall a. a -> [a] -> [a]
:) ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"+a") ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                  (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"-a") ([String] -> [Maybe EncodedCnstrs])
-> [String] -> [Maybe EncodedCnstrs]
forall a b. (a -> b) -> a -> b
$ [String]
args0)
       !arg0 :: Int
arg0 = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
1 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
numericArgs)::Maybe Int)
       !numberI :: Int
numberI = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
1 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
2 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
numericArgs)::Maybe Int)
       !choice :: String
choice = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
textualArgs
       !intervalNmbrs :: [Int]
intervalNmbrs = (\[Int]
zs -> if [Int] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Int]
zs then [Int
numberI] else [Int] -> [Int]
forall a. Eq a => [a] -> [a]
L.nub [Int]
zs) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int]
forall a. Ord a => [a] -> [a]
L.sort ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
numberI) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
           (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\String
t -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
numberI (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
t::Maybe Int)) ([String] -> [Int]) -> ([String] -> [String]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
2 ([String] -> [Int]) -> [String] -> [Int]
forall a b. (a -> b) -> a -> b
$ [String]
numericArgs
   if Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
l Int
2 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then let !frep20 :: FuncRep2 String Double Double
frep20
                                    | Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"x" Bool -> Bool -> Bool
|| Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"w" Bool -> Bool -> Bool
|| (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"H" Bool -> Bool -> Bool
&& (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
choice) String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"x",String
"w"]))= [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffsWX String
choice
                                    | Bool
otherwise = [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffs String
choice
                                 !wwss :: [Result [] Char Double Double]
wwss = (Result [] Char Double Double
-> [Result [] Char Double Double] -> [Result [] Char Double Double]
forall a. a -> [a] -> [a]
:[]) (Result [] Char Double Double -> [Result [] Char Double Double])
-> (String -> Result [] Char Double Double)
-> String
-> [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FuncRep2 String Double Double
-> String -> Result [] Char Double Double
forall (t :: * -> *) a b c.
FuncRep2 (t a) b c -> t a -> Result t a b c
toResultR FuncRep2 String Double Double
frep20 (String -> [Result [] Char Double Double])
-> String -> [Result [] Char Double Double]
forall a b. (a -> b) -> a -> b
$ String
xs in
    case Bool
recursiveMode of
      Bool
True -> [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
wwss [String]
args Bool
lstW2
      Bool
_ -> if Bool
interactive then Bool
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
wwss else Bool -> String -> [Result [] Char Double Double] -> IO String
print1el Bool
jstL0 String
choice [Result [] Char Double Double]
wwss
   else do
    let !subs :: [String]
subs = String -> String -> [String]
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a), Monoid (t (t a))) =>
t a -> t a -> t (t a)
subG String
" 01-" String
xs
    if [EncodedCnstrs] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [EncodedCnstrs]
argCs then let !perms :: [Array Int Int]
perms
                             | Bool
pairwisePermutations = Int -> [Array Int Int]
genPairwisePermutationsLN Int
l
                             | Bool
otherwise = Int -> [Array Int Int]
genPermutationsL Int
l in do
          [Result [] Char Double Double]
temp <- [[[[Sound8]]] -> [[Double]]]
-> Coeffs2
-> Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Coeffs2
coeffs Coeffs2
coeffsWX [Array Int Int]
perms [String]
subs ([Int]
intervalNmbrs, Int
arg0, Int
numberI, String
choice)
          if Bool
recursiveMode then [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
temp [String]
args Bool
lstW2
          else if Bool
interactive then Bool
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
temp else Bool -> String -> [Result [] Char Double Double] -> IO String
print1el Bool
jstL0 String
choice [Result [] Char Double Double]
temp
    else do
     String
correct <- Bool -> String -> IO String
printWarning Bool
nativeUkrainian String
xs
     if String
correct String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"n" then String -> IO ()
putStrLn (Int -> Bool -> String
messageInfo Int
1 Bool
nativeUkrainian) IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
"" -- for the multiple variations mode (with curly brackets and slash in the text) the program does not stop here, but the variation is made empty and is proposed further as a variant.
     else let !perms :: [Array Int Int]
perms = [EncodedCnstrs] -> [Array Int Int] -> [Array Int Int]
forall (t :: * -> *).
(InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) =>
[EncodedCnstrs] -> t (Array Int Int) -> t (Array Int Int)
decodeLConstraints [EncodedCnstrs]
argCs ([Array Int Int] -> [Array Int Int])
-> (Int -> [Array Int Int]) -> Int -> [Array Int Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Bool
pairwisePermutations then Int -> [Array Int Int]
genPairwisePermutationsLN else Int -> [Array Int Int]
genPermutationsL) (Int -> [Array Int Int]) -> Int -> [Array Int Int]
forall a b. (a -> b) -> a -> b
$ Int
l in do
          [Result [] Char Double Double]
temp <- [[[[Sound8]]] -> [[Double]]]
-> Coeffs2
-> Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Coeffs2
coeffs Coeffs2
coeffsWX [Array Int Int]
perms [String]
subs ([Int]
intervalNmbrs, Int
arg0, Int
numberI, String
choice)
          if Bool
recursiveMode then [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
temp [String]
args Bool
lstW2
          else if Bool
interactive then Bool
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
temp else Bool -> String -> [Result [] Char Double Double] -> IO String
print1el Bool
jstL0 String
choice [Result [] Char Double Double]
temp
  else do
   let !choices :: [String]
choices = ((String, [String]) -> String) -> [(String, [String])] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, [String]) -> String
forall a b. (a, b) -> a
fst [(String, [String])]
argMss
       !numericArgss :: [[String]]
numericArgss = ((String, [String]) -> [String])
-> [(String, [String])] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map (String, [String]) -> [String]
forall a b. (a, b) -> b
snd [(String, [String])]
argMss
       !arg0s :: [Int]
arg0s = ([String] -> Int) -> [[String]] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\[String]
ts -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
1 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
ts)::Maybe Int)) [[String]]
numericArgss
       !numberIs :: [Int]
numberIs = ([String] -> Int) -> [[String]] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\[String]
ts -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
1 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
2 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
ts)::Maybe Int)) [[String]]
numericArgss
       !intervalNmbrss :: [[Int]]
intervalNmbrss = ([String] -> [Int]) -> [[String]] -> [[Int]]
forall a b. (a -> b) -> [a] -> [b]
map (\[String]
us -> let !numberI :: Int
numberI = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
1 (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
2 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
us)::Maybe Int) in
         (\[Int]
zs -> if [Int] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Int]
zs then [Int
numberI] else [Int] -> [Int]
forall a. Eq a => [a] -> [a]
L.nub [Int]
zs) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [Int]
forall a. Ord a => [a] -> [a]
L.sort ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
numberI) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
           (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\String
t -> Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
numberI (Maybe Int -> Int) -> Maybe Int -> Int
forall a b. (a -> b) -> a -> b
$ (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
t::Maybe Int)) ([String] -> [Int]) -> ([String] -> [String]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
2 ([String] -> [Int]) -> [String] -> [Int]
forall a b. (a -> b) -> a -> b
$ [String]
us) ([[String]] -> [[Int]]) -> [[String]] -> [[Int]]
forall a b. (a -> b) -> a -> b
$ [[String]]
numericArgss
       !argsZipped :: [([Int], Int, Int, String)]
argsZipped = [[Int]]
-> [Int] -> [Int] -> [String] -> [([Int], Int, Int, String)]
forall a b c d. [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]
L.zip4 [[Int]]
intervalNmbrss [Int]
arg0s [Int]
numberIs [String]
choices
       !xs :: String
xs = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> String -> [String]
prepareTuneTextMN (if Bool
pairwisePermutations then Int
10 else Int
7) Int
1 (String -> [String])
-> ([String] -> String) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
args
       !l :: Int
l = [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
xs
       !argCs :: [EncodedCnstrs]
argCs = [Maybe EncodedCnstrs] -> [EncodedCnstrs]
forall a. [Maybe a] -> [a]
catMaybes ((String -> Maybe EncodedCnstrs)
-> [String] -> [Maybe EncodedCnstrs]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> String -> Maybe EncodedCnstrs
readMaybeECG (Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) ([String] -> [Maybe EncodedCnstrs])
-> ([String] -> [String]) -> [String] -> [Maybe EncodedCnstrs]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool -> String
showB Int
l Bool
lstW2String -> [String] -> [String]
forall a. a -> [a] -> [a]
:) ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"+a") ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                  (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"-a") ([String] -> [Maybe EncodedCnstrs])
-> [String] -> [Maybe EncodedCnstrs]
forall a b. (a -> b) -> a -> b
$ [String]
args0)
   if Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
l Int
2 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then let !frep20 :: FuncRep2 String Double Double
frep20 = [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffs ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
choices)
                                 !wwss :: [Result [] Char Double Double]
wwss = (Result [] Char Double Double
-> [Result [] Char Double Double] -> [Result [] Char Double Double]
forall a. a -> [a] -> [a]
:[]) (Result [] Char Double Double -> [Result [] Char Double Double])
-> (String -> Result [] Char Double Double)
-> String
-> [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FuncRep2 String Double Double
-> String -> Result [] Char Double Double
forall (t :: * -> *) a b c.
FuncRep2 (t a) b c -> t a -> Result t a b c
toResultR FuncRep2 String Double Double
frep20 (String -> [Result [] Char Double Double])
-> String -> [Result [] Char Double Double]
forall a b. (a -> b) -> a -> b
$ String
xs in
     case Bool
recursiveMode of
       Bool
True -> [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
wwss [String]
args Bool
lstW2
       Bool
_ -> if Bool
interactive then Bool
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
wwss else Bool -> String -> [Result [] Char Double Double] -> IO String
print1el Bool
jstL0 ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
choices) [Result [] Char Double Double]
wwss
   else do
    let !subs :: [String]
subs = String -> String -> [String]
forall (t :: * -> *) a.
(InsertLeft t a, Monoid (t a), Monoid (t (t a))) =>
t a -> t a -> t (t a)
subG String
" 01-" String
xs
    if [EncodedCnstrs] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [EncodedCnstrs]
argCs then let !perms :: [Array Int Int]
perms
                             | Bool
pairwisePermutations = Int -> [Array Int Int]
genPairwisePermutationsLN Int
l
                             | Bool
otherwise = Int -> [Array Int Int]
genPermutationsL Int
l in
       [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [([Int], Int, Int, String)]
-> [Array Int Int]
-> [String]
-> [String]
-> Bool
-> IO String
generalProcMMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [([Int], Int, Int, String)]
argsZipped [Array Int Int]
perms [String]
subs [String]
args Bool
lstW2
    else do
     String
correct <- Bool -> String -> IO String
printWarning Bool
nativeUkrainian String
xs
     if String
correct String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"n" then String -> IO ()
putStrLn (Int -> Bool -> String
messageInfo Int
1 Bool
nativeUkrainian) IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
"" -- for the multiple variations mode (with curly brackets and slash in the text) the program does not stop here, but the variation is made empty and is proposed further as a variant.
     else let !perms :: [Array Int Int]
perms = [EncodedCnstrs] -> [Array Int Int] -> [Array Int Int]
forall (t :: * -> *).
(InsertLeft t (Array Int Int), Monoid (t (Array Int Int))) =>
[EncodedCnstrs] -> t (Array Int Int) -> t (Array Int Int)
decodeLConstraints [EncodedCnstrs]
argCs ([Array Int Int] -> [Array Int Int])
-> (Int -> [Array Int Int]) -> Int -> [Array Int Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Bool
pairwisePermutations then Int -> [Array Int Int]
genPairwisePermutationsLN else Int -> [Array Int Int]
genPermutationsL) (Int -> [Array Int Int]) -> Int -> [Array Int Int]
forall a b. (a -> b) -> a -> b
$ Int
l in [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [([Int], Int, Int, String)]
-> [Array Int Int]
-> [String]
-> [String]
-> Bool
-> IO String
generalProcMMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [([Int], Int, Int, String)]
argsZipped [Array Int Int]
perms [String]
subs [String]
args Bool
lstW2

{-|
-- @ since 0.4.0.0
Function provides localized message information. If the 'Bool' argument is 'True' then it gives result in Ukrainian, otherwise -- in English.
-}
messageInfo :: Int -> Bool -> String
messageInfo :: Int -> Bool -> String
messageInfo Int
n Bool
True
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = String
"Ви зупинили програму, будь ласка, якщо потрібно, виконайте її знову з кращими аргументами. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 = String
"Будь ласка, вкажіть варіант (який Ви бажаєте, щоб він став результуючим рядком) за його номером. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
3 = String
"Будь ласка, перевірте, чи рядок нижче відповідає і узгоджується з обмеженнями, які Ви вказали між +a та -a опціями. Перевірте також, чи Ви вказали \"+b\" чи \"+bl\" опцію(ї). Якщо введені опції та аргументи не узгоджені з виведеним далі рядком, тоді введіть далі \"n\", натисніть Enter і опісля запустіть програму на виконання знову з кращими аргументами. " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
"Якщо рядок узгоджується з Вашим вводом між +a та -a, тоді просто натисніть Enter, щоб продовжити далі. " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
4 = String
"Було задано недостатньо інформації для продовження обчислювального процесу "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
5 = String
"(/ Ви вказали властивості(ість) та діапазон(и) для них такі, що для даних слів та їх сполучень варіантів немає. Спробуйте змінити параметри виклику програми (бібліотеки) /)"
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
6 = String
"Якщо бажаєте запустити програму (функцію) рекурсивно, змінюючи сполучення слів та букв, введіть тут закодований рядок інтерпретатора. Якщо бажаєте не використовувати програму (функцію) рекурсивно, просто натисніть Enter. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
7 = String
"Введіть, будь ласка, рядок слів для аналізу. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
8 = String
"Введіть, будь ласка, кількість слів чи їх сполучень, які програма розглядатиме як один рядок для аналізу. "
 | Bool
otherwise = String
"Ви вказали лише один варіант властивостей. "
messageInfo Int
n Bool
False
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = String
"You stopped the program, please, if needed, run it again with better arguments. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 = String
"Please, specify the variant which you would like to become the resulting string by its number. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
3 = String
"Please, check whether the line below corresponds and is consistent with the constraints you have specified between the +a and -a options. Check also whether you have specified the \"+b\" or \"+bl\" option(s). If it is inconsistent then enter further \"n\", press Enter and then run the program again with better arguments. " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
"If the line is consistent with your input between +a and -a then just press Enter to proceed further. " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
4 = String
"No data has been specified to control the computation process. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
5 = String
"(/ You have specified properties / property and the range(s) so that for the words and their concatenations there are no variants available. Try to change the call parameters /)"
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
6 = String
"If you would like to run the program (call the function) recursively with changes for the words or letter connections then, please, enter here the encoded string of the interpreter. If you would NOT like to use it recursively, then just press Enter."
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
7 = String
"Please, input the text line for analysis. "
 | Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
8 = String
"Please, input the number of words or their concatenations that the program takes as one line for analysis. "
 | Bool
otherwise = String
"You have specified just one variant of the properties. "

-- |
-- @ since 0.3.0.0 The result is not 'IO' (), but 'IO' 'String'. The type also changed generally.
-- @ since 0.8.0.0 The function has also the option for the empty result.
interactivePrintResult
 :: Bool
 -> (a -> String)
 -> [a]
 -> IO String
interactivePrintResult :: Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian a -> String
f [a]
xss
  | [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xss = (String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
5 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian) IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
""
  | Bool
otherwise = do
     let !datas :: [String]
datas = ((Int, String) -> String) -> [(Int, String)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
idx,String
str) -> Int -> String
forall a. Show a => a -> String
show Int
idx String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (Char
'\t' Char -> String -> String
forall a. a -> [a] -> [a]
: String
str)) ([(Int, String)] -> [String])
-> ([a] -> [(Int, String)]) -> [a] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [(Int, String)]
forall a. [[a]] -> [(Int, [a])]
trans232 ([String] -> [(Int, String)])
-> ([a] -> [String]) -> [a] -> [(Int, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> String) -> [a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map a -> String
f ([a] -> [String]) -> [a] -> [String]
forall a b. (a -> b) -> a -> b
$ [a]
xss
     (String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ String -> IO ()
putStrLn [String]
datas
     String -> IO ()
putStrLn String
""
     String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
2 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian
     String
number <- IO String
getLine
     let !lineRes :: String
lineRes = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((String
number String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
"\t")String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`L.isPrefixOf`) ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
datas
         !ts :: String
ts = Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\t') (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
lineRes
     String -> IO ()
putStrLn String
ts IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
ts

interactivePrintResultRecursive
 :: [[[[Sound8]]] -> [[Double]]] -- ^ Whether to use the own provided durations.
 -> Bool -- ^ Whether to use just pairwise permutations, or the full universal set.
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> [String]
 -> Coeffs2
 -> Coeffs2
 -> (a -> String)
 -> [a]
 -> [String]
 -> Bool
 -> IO String
interactivePrintResultRecursive :: [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX a -> String
f [a]
xss [String]
args Bool
lstW2
  | [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xss = (String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
5 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian) IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
""
  | Bool
otherwise = do
     let !datas :: [String]
datas = ((Int, String) -> String) -> [(Int, String)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
idx,String
str) -> Int -> String
forall a. Show a => a -> String
show Int
idx String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (Char
'\t' Char -> String -> String
forall a. a -> [a] -> [a]
: String
str)) ([(Int, String)] -> [String])
-> ([a] -> [(Int, String)]) -> [a] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> [(Int, String)]
forall a. [[a]] -> [(Int, [a])]
trans232 ([String] -> [(Int, String)])
-> ([a] -> [String]) -> [a] -> [(Int, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> String) -> [a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map a -> String
f ([a] -> [String]) -> [a] -> [String]
forall a b. (a -> b) -> a -> b
$ [a]
xss
     (String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ String -> IO ()
putStrLn [String]
datas
     String -> IO ()
putStrLn String
""
     String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
2 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian
     String
number <- IO String
getLine
     let !lineRes :: String
lineRes = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((String
number String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
"\t")String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`L.isPrefixOf`) ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String]
datas
         !ts :: String
ts = Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\t') (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
lineRes
     String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
6 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian
     String
stringInterpreted <- IO String
getLine
     if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
stringInterpreted then String -> IO ()
putStrLn String
ts IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
ts
     else do
       let strIntrpr :: String
strIntrpr = String -> String -> String
convStringInterpreter String
stringInterpreted String
ts
           !firstArgs :: [String]
firstArgs = (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isLetter) [String]
args
       [String]
wordsNN <-
         if Bool
pairwisePermutations then do
           String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
8 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian
           String
mStr <- IO String
getLine
           let m :: Int
m = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
10 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
mStr::Maybe Int) in [String] -> IO [String]
forall (m :: * -> *) a. Monad m => a -> m a
return ([String] -> IO [String])
-> (String -> [String]) -> String -> IO [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
m ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> IO [String]) -> String -> IO [String]
forall a b. (a -> b) -> a -> b
$ String
strIntrpr
         else [String] -> IO [String]
forall (m :: * -> *) a. Monad m => a -> m a
return ([String] -> IO [String])
-> (String -> [String]) -> String -> IO [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
7 ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> IO [String]) -> String -> IO [String]
forall a b. (a -> b) -> a -> b
$ String
strIntrpr
       [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX ([String]
firstArgs [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` [String]
wordsNN) Bool
lstW2

printWarning :: Bool -> String -> IO String
printWarning :: Bool -> String -> IO String
printWarning Bool
nativeUkrainian String
xs = do
  String -> IO ()
putStrLn (String -> IO ()) -> (Bool -> String) -> Bool -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> String
messageInfo Int
3 (Bool -> IO ()) -> Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Bool
nativeUkrainian
  String -> IO ()
putStrLn String
xs
  IO String
getLine

generalProcMs
 :: [[[[Sound8]]] -> [[Double]]] -- ^ Whether to use the own provided durations.
 -> Coeffs2
 -> Coeffs2
 -> [Array Int Int]
 -> [String]
 -> ([Int],Int,Int,String)
 -> IO [Result [] Char Double Double]
generalProcMs :: [[[[Sound8]]] -> [[Double]]]
-> Coeffs2
-> Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Coeffs2
coeffs Coeffs2
coeffsWX [Array Int Int]
perms [String]
subs ([Int]
intervalNmbrs, Int
arg0, Int
numberI, String
choice) = do
  if Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
numberI Int
2 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT then let !frep2 :: FuncRep2 String Double Double
frep2 = if Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"x" Bool -> Bool -> Bool
|| Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"w" Bool -> Bool -> Bool
|| (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"H" Bool -> Bool -> Bool
&& (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
choice) String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"x",String
"w"])) then [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffsWX String
choice else [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffs String
choice
   in [Result [] Char Double Double] -> IO [Result [] Char Double Double]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Result [] Char Double Double]
 -> IO [Result [] Char Double Double])
-> ([String] -> [Result [] Char Double Double])
-> [String]
-> IO [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Result [] Char Double Double], [Result [] Char Double Double])
-> [Result [] Char Double Double]
forall a b. (a, b) -> a
fst (([Result [] Char Double Double], [Result [] Char Double Double])
 -> [Result [] Char Double Double])
-> ([String]
    -> ([Result [] Char Double Double],
        [Result [] Char Double Double]))
-> [String]
-> [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int
-> [Result [] Char Double Double]
-> ([Result [] Char Double Double], [Result [] Char Double Double])
forall (t2 :: * -> *) (t :: * -> *) a b c d.
(InsertLeft t2 (Result t a b c), Monoid (t2 (Result t a b c)),
 InsertLeft t2 c, Monoid (t2 c), Ord c, Integral d) =>
d
-> t2 (Result t a b c)
-> (t2 (Result t a b c), t2 (Result t a b c))
maximumGroupsClassificationR Int
arg0 ([Result [] Char Double Double]
 -> ([Result [] Char Double Double],
     [Result [] Char Double Double]))
-> ([String] -> [Result [] Char Double Double])
-> [String]
-> ([Result [] Char Double Double], [Result [] Char Double Double])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Result [] Char Double Double)
-> [String] -> [Result [] Char Double Double]
forall a b. (a -> b) -> [a] -> [b]
map (FuncRep2 String Double Double
-> String -> Result [] Char Double Double
forall (t :: * -> *) a b c.
FuncRep2 (t a) b c -> t a -> Result t a b c
toResultR FuncRep2 String Double Double
frep2) ([String] -> [Result [] Char Double Double])
-> ([String] -> [String])
-> [String]
-> [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        Char
-> (String -> String)
-> ([String] -> [String])
-> (String -> String)
-> [Array Int Int]
-> [String]
-> [String]
forall a (t :: * -> *).
(Eq a, Foldable t, InsertLeft t a, Monoid (t a),
 Monoid (t (t a))) =>
a
-> (t a -> [a])
-> (t (t a) -> [[a]])
-> ([a] -> t a)
-> [Array Int Int]
-> t (t a)
-> [t a]
uniquenessVariants2GNBL Char
' ' String -> String
forall a. a -> a
id [String] -> [String]
forall a. a -> a
id String -> String
forall a. a -> a
id [Array Int Int]
perms ([String] -> IO [Result [] Char Double Double])
-> [String] -> IO [Result [] Char Double Double]
forall a b. (a -> b) -> a -> b
$ [String]
subs
  else do
    let !variants1 :: [String]
variants1 = Char
-> (String -> String)
-> ([String] -> [String])
-> (String -> String)
-> [Array Int Int]
-> [String]
-> [String]
forall a (t :: * -> *).
(Eq a, Foldable t, InsertLeft t a, Monoid (t a),
 Monoid (t (t a))) =>
a
-> (t a -> [a])
-> (t (t a) -> [[a]])
-> ([a] -> t a)
-> [Array Int Int]
-> t (t a)
-> [t a]
uniquenessVariants2GNBL Char
' ' String -> String
forall a. a -> a
id [String] -> [String]
forall a. a -> a
id String -> String
forall a. a -> a
id [Array Int Int]
perms [String]
subs
        !frep20 :: FuncRep2 String Double Double
frep20
          | Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"x" Bool -> Bool -> Bool
|| Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"w" Bool -> Bool -> Bool
||
              (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"H" Bool -> Bool -> Bool
&& (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
choice) String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"x",String
"w"])) = [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffsWX String
choice
          | Bool
otherwise = [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Double -> Double
forall a. a -> a
id Coeffs2
coeffs String
choice
        (!Double
minE,!Double
maxE) = [Double] -> (Double, Double)
forall a (t :: * -> *).
(Ord a, InsertLeft t a, Monoid (t a)) =>
t a -> (a, a)
minMax11C ([Double] -> (Double, Double))
-> ([String] -> [Double]) -> [String] -> (Double, Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Double) -> [String] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (FuncRep2 String Double Double -> String -> Double
forall (t :: * -> *) a b c. FuncRep2 (t a) b c -> t a -> b
toPropertiesF' FuncRep2 String Double Double
frep20) ([String] -> (Double, Double)) -> [String] -> (Double, Double)
forall a b. (a -> b) -> a -> b
$ [String]
variants1
        !frep2 :: FuncRep2 String Double Double
frep2
          | Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"x" Bool -> Bool -> Bool
|| Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"w" Bool -> Bool -> Bool
||
              (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
choice String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"H" Bool -> Bool -> Bool
&& (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
2 String
choice) String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"x",String
"w"])) = [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs (Double -> Double -> Int -> [Int] -> Double -> Double
forall b c.
(RealFrac b, Integral c) =>
b -> b -> c -> [c] -> b -> b
unsafeSwapVecIWithMaxI Double
minE Double
maxE Int
numberI [Int]
intervalNmbrs) Coeffs2
coeffsWX String
choice
          | Bool
otherwise = [[[[Sound8]]] -> [[Double]]]
-> (Double -> Double)
-> Coeffs2
-> String
-> FuncRep2 String Double Double
forall c.
Ord c =>
[[[[Sound8]]] -> [[Double]]]
-> (Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs (Double -> Double -> Int -> [Int] -> Double -> Double
forall b c.
(RealFrac b, Integral c) =>
b -> b -> c -> [c] -> b -> b
unsafeSwapVecIWithMaxI Double
minE Double
maxE Int
numberI [Int]
intervalNmbrs) Coeffs2
coeffs String
choice
    [Result [] Char Double Double] -> IO [Result [] Char Double Double]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Result [] Char Double Double]
 -> IO [Result [] Char Double Double])
-> ([String] -> [Result [] Char Double Double])
-> [String]
-> IO [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Result [] Char Double Double], [Result [] Char Double Double])
-> [Result [] Char Double Double]
forall a b. (a, b) -> a
fst (([Result [] Char Double Double], [Result [] Char Double Double])
 -> [Result [] Char Double Double])
-> ([String]
    -> ([Result [] Char Double Double],
        [Result [] Char Double Double]))
-> [String]
-> [Result [] Char Double Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int
-> [Result [] Char Double Double]
-> ([Result [] Char Double Double], [Result [] Char Double Double])
forall (t2 :: * -> *) (t :: * -> *) a b c d.
(InsertLeft t2 (Result t a b c), Monoid (t2 (Result t a b c)),
 InsertLeft t2 c, Monoid (t2 c), Ord c, Integral d) =>
d
-> t2 (Result t a b c)
-> (t2 (Result t a b c), t2 (Result t a b c))
maximumGroupsClassificationR Int
arg0 ([Result [] Char Double Double]
 -> ([Result [] Char Double Double],
     [Result [] Char Double Double]))
-> ([String] -> [Result [] Char Double Double])
-> [String]
-> ([Result [] Char Double Double], [Result [] Char Double Double])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Result [] Char Double Double)
-> [String] -> [Result [] Char Double Double]
forall a b. (a -> b) -> [a] -> [b]
map (FuncRep2 String Double Double
-> String -> Result [] Char Double Double
forall (t :: * -> *) a b c.
FuncRep2 (t a) b c -> t a -> Result t a b c
toResultR FuncRep2 String Double Double
frep2) ([String] -> IO [Result [] Char Double Double])
-> [String] -> IO [Result [] Char Double Double]
forall a b. (a -> b) -> a -> b
$ [String]
variants1

-- |
-- @ since 0.3.0.0 The result is not 'IO' (), but 'IO' 'String'. The type also changed generally.
generalProcMMs
 :: [[[[Sound8]]] -> [[Double]]] -- ^ Whether to use the own provided durations.
 -> Bool  -- ^ Whether to use just pairwise permutations, or the full universal set.
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> [String]
 -> Coeffs2
 -> Coeffs2
 -> [([Int],Int,Int,String)]
 -> [Array Int Int]
 -> [String]
 -> [String]
 -> Bool
 -> IO String
generalProcMMs :: [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> [([Int], Int, Int, String)]
-> [Array Int Int]
-> [String]
-> [String]
-> Bool
-> IO String
generalProcMMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactiveMM Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX [([Int], Int, Int, String)]
rs [Array Int Int]
perms [String]
subs [String]
args Bool
lstW2 =
 case [([Int], Int, Int, String)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [([Int], Int, Int, String)]
rs of
  Int
0 -> String -> IO ()
putStrLn (Int -> Bool -> String
messageInfo Int
4 Bool
nativeUkrainian) IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
""
  Int
1 -> String -> IO ()
putStrLn (Int -> Bool -> String
messageInfo Int
5 Bool
nativeUkrainian) IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> do
        [Result [] Char Double Double]
temp <- [[[[Sound8]]] -> [[Double]]]
-> Coeffs2
-> Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Coeffs2
coeffs Coeffs2
coeffsWX [Array Int Int]
perms [String]
subs ([([Int], Int, Int, String)] -> ([Int], Int, Int, String)
forall a. [a] -> a
head [([Int], Int, Int, String)]
rs)
        [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
finalProc [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactiveMM Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
temp [String]
args Bool
lstW2
  Int
_ -> do
         [[Result [] Char Double Double]]
genVariants <- (([Int], Int, Int, String) -> IO [Result [] Char Double Double])
-> [([Int], Int, Int, String)]
-> IO [[Result [] Char Double Double]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ([[[[Sound8]]] -> [[Double]]]
-> Coeffs2
-> Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Coeffs2
coeffs Coeffs2
coeffsWX [Array Int Int]
perms [String]
subs) [([Int], Int, Int, String)]
rs
         [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (String -> String)
-> [String]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
finalProc [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactiveMM Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX String -> String
forall a. a -> a
id ([[String]] -> [String]
foldlI ([[String]] -> [String])
-> ([[Result [] Char Double Double]] -> [[String]])
-> [[Result [] Char Double Double]]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Result [] Char Double Double] -> [String])
-> [[Result [] Char Double Double]] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map ((Result [] Char Double Double -> String)
-> [Result [] Char Double Double] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line) ([[Result [] Char Double Double]] -> [String])
-> [[Result [] Char Double Double]] -> [String]
forall a b. (a -> b) -> a -> b
$ [[Result [] Char Double Double]]
genVariants) [String]
args Bool
lstW2

foldlI :: [[String]] -> [String]
foldlI :: [[String]] -> [String]
foldlI ([String]
xs:[String]
ys:[[String]]
xss) = [[String]] -> [String]
foldlI ([String] -> [String] -> [String]
intersectInterResults [String]
xs [String]
ys [String] -> [[String]] -> [[String]]
forall a. a -> [a] -> [a]
: [[String]]
xss)
foldlI ([String]
xs:[[String]]
_) = [String]
xs
foldlI [[String]]
_ = []

-- |
-- @ since 0.3.0.0 The result is not 'IO' (), but 'IO' 'String'. The type also changed generally.
finalProc
 :: [[[[Sound8]]] -> [[Double]]] -- ^ Whether to use the own provided durations.
 -> Bool -- ^ Whether to use just pairwise permutations, or the full universal set.
 -> Bool
 -> Bool
 -> Bool
 -> Bool
 -> [String]
 -> Coeffs2
 -> Coeffs2
 -> (a -> String)
 -> [a]
 -> [String]
 -> Bool
 -> IO String
finalProc :: [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
finalProc [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX a -> String
f [a]
xss [String]
args Bool
lstW2
 | Bool
recursiveMode = [[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
forall a.
[[[[Sound8]]] -> [[Double]]]
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> Coeffs2
-> (a -> String)
-> [a]
-> [String]
-> Bool
-> IO String
interactivePrintResultRecursive [[[[Sound8]]] -> [[Double]]]
syllableDurationsDs Bool
pairwisePermutations Bool
recursiveMode Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs Coeffs2
coeffsWX a -> String
f [a]
xss [String]
args Bool
lstW2
 | Bool
interactive = Bool -> (a -> String) -> [a] -> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian a -> String
f [a]
xss
 | Bool
otherwise = String -> IO ()
putStrLn String
ts IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
ts
  where ts :: String
ts = (a -> String) -> [a] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\a
t -> a -> String
f a
t String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding) [a]
xss

-- |
-- @ since 0.3.0.0 The result is not 'IO' (), but 'IO' 'String'. The type also changed generally.
print1el
 :: Bool
 -> String
 -> [Result [] Char Double Double]
 -> IO String
print1el :: Bool -> String -> [Result [] Char Double Double] -> IO String
print1el Bool
jstlines String
choice [Result [] Char Double Double]
y
 | Bool
jstlines Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True = String -> IO ()
putStrLn String
us IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
us
 | Bool
otherwise = String -> IO ()
putStrLn String
zs IO () -> IO String -> IO String
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
zs
       where !ch :: Maybe Int
ch = String -> Maybe Int
precChoice String
choice
             !us :: String
us = (Result [] Char Double Double -> String)
-> [Result [] Char Double Double] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Result [] Char Double Double
ys -> Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line Result [] Char Double Double
ys String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding) [Result [] Char Double Double]
y
             !zs :: String
zs = (Result [] Char Double Double -> String)
-> [Result [] Char Double Double] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Result [] Char Double Double
ys -> Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line Result [] Char Double Double
ys String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
newLineEnding String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
ch (Result [] Char Double Double -> Double
forall (t :: * -> *) a b c. Result t a b c -> b
propertiesF Result [] Char Double Double
ys) (String
newLineEnding String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` Maybe Int -> Double -> String -> String
forall a. RealFloat a => Maybe Int -> a -> String -> String
showFFloat Maybe Int
ch (Result [] Char Double Double -> Double
forall (t :: * -> *) a b c. Result t a b c -> c
transPropertiesF Result [] Char Double Double
ys) String
newLineEnding)) [Result [] Char Double Double]
y