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

-- |
-- Module      :  Phonetic.Languages.Simple
-- Copyright   :  (c) OleksandrZhabenko 2020
-- 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.

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.Array.Ukrainian.PropertiesSyllablesG2
import Phonetic.Languages.Filters (unsafeSwapVecIWithMaxI)
import Phonetic.Languages.Simplified.StrictVG.Base
import Data.Char (isDigit,isAlpha)
import qualified Data.List  as L (span,sort,zip4,isPrefixOf,nub)
import Phonetic.Languages.Simplified.Array.Ukrainian.FuncRep2RelatedG2
import Phonetic.Languages.Permutations.Arr
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 Phonetic.Languages.Common

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]
_ = []

-- |
-- @ since 0.3.0.0
-- Is used to do general processment.
generalProc2G :: Bool -> FilePath -> Bool -> Bool -> [String] -> Coeffs2 -> [String] -> Bool -> IO ()
generalProc2G :: Bool
-> String
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> [String]
-> Bool
-> IO ()
generalProc2G Bool
nativeUkrainian String
toFile1 Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs [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 -> Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs [String]
xss Bool
lstW2) [[String]]
zsss
    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 = Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs [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 :: Bool -> Bool -> Bool -> [String] -> Coeffs2 -> [String] -> Bool -> IO String
generalProc2 :: Bool
-> Bool
-> Bool
-> [String]
-> Coeffs2
-> [String]
-> Bool
-> IO String
generalProc2 Bool
nativeUkrainian Bool
interactive Bool
jstL0 [String]
args0 Coeffs2
coeffs [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 -> String -> [String]
fLines Int
0 (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 = (Double -> Double)
-> Coeffs2 -> String -> FuncRep2 String Double Double
forall c.
Ord c =>
(Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax Double -> Double
forall a. a -> a
id Coeffs2
coeffs String
choice in let !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
    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 = Int -> [Array Int Int]
genPermutationsL Int
l in do
          [Result [] Char Double Double]
temp <- Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs Coeffs2
coeffs [Array Int Int]
perms [String]
subs ([Int]
intervalNmbrs, Int
arg0, Int
numberI, String
choice)
          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
. 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 <- Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs Coeffs2
coeffs [Array Int Int]
perms [String]
subs ([Int]
intervalNmbrs, Int
arg0, Int
numberI, String
choice)
          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 -> String -> [String]
fLines Int
0 (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 = (Double -> Double)
-> Coeffs2 -> String -> FuncRep2 String Double Double
forall c.
Ord c =>
(Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax 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) in let !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 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 = Int -> [Array Int Int]
genPermutationsL Int
l in Bool
-> Bool
-> Coeffs2
-> [([Int], Int, Int, String)]
-> [Array Int Int]
-> [String]
-> IO String
generalProcMMs Bool
nativeUkrainian Bool
interactive Coeffs2
coeffs [([Int], Int, Int, String)]
argsZipped [Array Int Int]
perms [String]
subs
    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
. Int -> [Array Int Int]
genPermutationsL (Int -> [Array Int Int]) -> Int -> [Array Int Int]
forall a b. (a -> b) -> a -> b
$ Int
l in Bool
-> Bool
-> Coeffs2
-> [([Int], Int, Int, String)]
-> [Array Int Int]
-> [String]
-> IO String
generalProcMMs Bool
nativeUkrainian Bool
interactive Coeffs2
coeffs [([Int], Int, Int, String)]
argsZipped [Array Int Int]
perms [String]
subs

{-|
-- @ 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
"Було задано недостатньо інформації для продовження обчислювального процесу "
 | 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. "
 | 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.
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 () -> 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
     
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 :: Coeffs2 -> [Array Int Int] -> [String] -> ([Int],Int,Int,String) -> IO [Result [] Char Double Double]
generalProcMs :: Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs Coeffs2
coeffs [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 = (Double -> Double)
-> Coeffs2 -> String -> FuncRep2 String Double Double
forall c.
Ord c =>
(Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax 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 = (Double -> Double)
-> Coeffs2 -> String -> FuncRep2 String Double Double
forall c.
Ord c =>
(Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax 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 = (Double -> Double)
-> Coeffs2 -> String -> FuncRep2 String Double Double
forall c.
Ord c =>
(Double -> c) -> Coeffs2 -> String -> FuncRep2 String Double c
chooseMax (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 :: Bool -> Bool -> Coeffs2 -> [([Int],Int,Int,String)] -> [Array Int Int] -> [String] -> IO String
generalProcMMs :: Bool
-> Bool
-> Coeffs2
-> [([Int], Int, Int, String)]
-> [Array Int Int]
-> [String]
-> IO String
generalProcMMs Bool
nativeUkrainian Bool
interactiveMM Coeffs2
coeffs [([Int], Int, Int, String)]
rs [Array Int Int]
perms [String]
subs =
 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 <- Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs Coeffs2
coeffs [Array Int Int]
perms [String]
subs ([([Int], Int, Int, String)] -> ([Int], Int, Int, String)
forall a. [a] -> a
head [([Int], Int, Int, String)]
rs)
        Bool
-> Bool
-> (Result [] Char Double Double -> String)
-> [Result [] Char Double Double]
-> IO String
forall a. Bool -> Bool -> (a -> String) -> [a] -> IO String
finalProc Bool
nativeUkrainian Bool
interactiveMM Result [] Char Double Double -> String
forall (t :: * -> *) a b c. Result t a b c -> t a
line [Result [] Char Double Double]
temp
  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 (Coeffs2
-> [Array Int Int]
-> [String]
-> ([Int], Int, Int, String)
-> IO [Result [] Char Double Double]
generalProcMs Coeffs2
coeffs [Array Int Int]
perms [String]
subs) [([Int], Int, Int, String)]
rs
         Bool -> Bool -> (String -> String) -> [String] -> IO String
forall a. Bool -> Bool -> (a -> String) -> [a] -> IO String
finalProc Bool
nativeUkrainian Bool
interactiveMM String -> String
forall a. a -> a
id ([String] -> IO String)
-> ([[Result [] Char Double Double]] -> [String])
-> [[Result [] Char Double Double]]
-> IO String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[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]] -> IO String)
-> [[Result [] Char Double Double]] -> IO String
forall a b. (a -> b) -> a -> b
$ [[Result [] Char Double Double]]
genVariants

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 :: Bool -> Bool -> (a -> String) -> [a] -> IO String
finalProc :: Bool -> Bool -> (a -> String) -> [a] -> IO String
finalProc Bool
nativeUkrainian Bool
bool a -> String
f [a]
xss = if Bool
bool then Bool -> (a -> String) -> [a] -> IO String
forall a. Bool -> (a -> String) -> [a] -> IO String
interactivePrintResult Bool
nativeUkrainian a -> String
f [a]
xss else 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