-- |
-- Module      :  Languages.UniquenessPeriods.Vector.General.Debug
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Generalization of the functionality of the DobutokO.Poetry.General.Debug
-- module from the @dobutokO-poetry-general-languages@ package. Since 0.3.0.0 version
-- changed the names of most functions to more appropriate. The conversion table of
-- the old to new names are given in a file ConversionTable.txt in the main source
-- directory.

{-# LANGUAGE BangPatterns #-}

module Languages.UniquenessPeriods.Vector.General.Debug (
  -- * Pure functions
  -- ** Self-recursive pure functions and connected with them ones
  maximumElBy
  , uniqNPropertiesN
  , uniqNPropertiesNAll
  , uniqNProperties2GN
  -- ** Pure functions
  , maximumElByAll
  , maximumElGBy
  , uniquenessVariantsGN
  , maximumElByVec
  , maximumElByVecAll
  -- * IO functions
  -- ** Printing subsystem
  , toFile
  , printUniquenessG1
  , printUniquenessG1List
  -- *** With 'String'-based arguments
  , printUniquenessG1ListStr
  -- *** Auxiliary function
  , newLineEnding
) where

import Data.Print.Info
import Data.List (intersperse)
import System.IO
import qualified Data.Vector as V
import Languages.UniquenessPeriods.Vector.Auxiliary
import Languages.UniquenessPeriods.Vector.StrictV
import Languages.UniquenessPeriods.Vector.Data

-- | The function evaluates the 'V.Vector' of 'UniquenessG1' @a@ @b@ elements (related with the third argument) to retrieve the possibly maximum element
-- in it with respect to the order and significance (principality)  of the \"properties\" (represented as the functions @f :: [b] -> b@) being evaluated.
-- The most significant and principal is the \"property\", which index in the 'V.Vector' of them is the 'Int' argument (so it is the first one) of the
-- function minus 1, then less significant is the next to the left \"property\" and so on.
-- The predefined library \"properties\" or related to them functions can be found in the package @uniqueness-periods-vector-properties@.
maximumElBy ::
  (Eq a, Ord b) => Int -- ^ The quantity of the represented as functions \"properties\" to be applied from the second argument. The order is from the right to the left.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  ->  UniqG2 a b -- ^ The data to be analyzed.
  -> UniquenessG1 a b -- ^ The maximum element in respect with the given parameters.
maximumElBy :: Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
maximumElBy Int
k Vector ([b] -> b)
vN UniqG2 a b
y
 | Vector (UniquenessG1 a b) -> Bool
forall a. Vector a -> Bool
V.null (Vector (UniquenessG1 a b) -> Bool)
-> (UniqG2 a b -> Vector (UniquenessG1 a b)) -> UniqG2 a b -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> Vector (UniquenessG1 a b)
forall a b. (a, b) -> b
snd (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> Bool) -> UniqG2 a b -> Bool
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
y = [Char] -> UniquenessG1 a b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.General.Debug.maximumElBy: undefined for the empty second element in the tuple. "
 | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k (Vector ([b] -> b) -> Int
forall a. Vector a -> Int
V.length Vector ([b] -> b)
vN) Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = [Char] -> UniquenessG1 a b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.General.Debug.maximumElBy: undefined for that amount of norms. "
 | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT =
   let !maxK :: UniquenessG1 a b
maxK = (UniquenessG1 a b -> UniquenessG1 a b -> Ordering)
-> Vector (UniquenessG1 a b) -> UniquenessG1 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
V.maximumBy (\([b]
_,Vector b
vN0,[a]
_) ([b]
_,Vector b
vN1,[a]
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))) (Vector (UniquenessG1 a b) -> UniquenessG1 a b)
-> (UniqG2 a b -> Vector (UniquenessG1 a b))
-> UniqG2 a b
-> UniquenessG1 a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> Vector (UniquenessG1 a b)
forall a b. (a, b) -> b
snd (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> UniquenessG1 a b) -> UniqG2 a b -> UniquenessG1 a b
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
y
       vK :: Vector (UniquenessG1 a b)
vK = (UniquenessG1 a b -> Bool)
-> Vector (UniquenessG1 a b) -> Vector (UniquenessG1 a b)
forall a. (a -> Bool) -> Vector a -> Vector a
V.filter (\([b]
_,Vector b
vN2,[a]
_) -> Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex (UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 a b
maxK) (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (Vector (UniquenessG1 a b) -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> Vector (UniquenessG1 a b))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> Vector (UniquenessG1 a b)
forall a b. (a, b) -> b
snd (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> Vector (UniquenessG1 a b))
-> UniqG2 a b -> Vector (UniquenessG1 a b)
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
y in
         Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
forall a b.
(Eq a, Ord b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
maximumElBy (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int -> Int -> Vector ([b] -> b) -> Vector ([b] -> b)
forall a. Int -> Int -> Vector a -> Vector a
V.unsafeSlice Int
0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Vector ([b] -> b)
vN) (([UniquenessG1 a b], Vector (UniquenessG1 a b)) -> UniqG2 a b
forall a b. ([a], b) -> UniquenessG2 a b
UL2 (([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> [UniquenessG1 a b]
forall a b. (a, b) -> a
fst (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> [UniquenessG1 a b])
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> [UniquenessG1 a b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> [UniquenessG1 a b])
-> UniqG2 a b -> [UniquenessG1 a b]
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
y,Vector (UniquenessG1 a b)
vK))
 | Bool
otherwise = (UniquenessG1 a b -> UniquenessG1 a b -> Ordering)
-> Vector (UniquenessG1 a b) -> UniquenessG1 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
V.maximumBy (\([b]
_,Vector b
vN0,[a]
_) ([b]
_,Vector b
vN1,[a]
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN0 Int
0) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN1 Int
0)) (Vector (UniquenessG1 a b) -> UniquenessG1 a b)
-> (UniqG2 a b -> Vector (UniquenessG1 a b))
-> UniqG2 a b
-> UniquenessG1 a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> Vector (UniquenessG1 a b)
forall a b. (a, b) -> b
snd (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> UniquenessG1 a b) -> UniqG2 a b -> UniquenessG1 a b
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
y
{-# INLINABLE maximumElBy #-}

-- | Prints every 'String' from the list on the new line to the file. Uses 'appendFile' function inside.
toFile ::
  FilePath -- ^ The 'FilePath' to the file to be written in the 'AppendMode' (actually appended with) the information output.
  -> [String] -- ^ Each 'String' is appended on the new line to the file.
  -> IO ()
toFile :: [Char] -> [[Char]] -> IO ()
toFile [Char]
file [[Char]]
xss = (([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ([Char] -> [Char] -> IO ()
appendFile [Char]
file) ([[Char]] -> IO ()) -> ([[Char]] -> [[Char]]) -> [[Char]] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
intersperse [Char]
newLineEnding ([[Char]] -> IO ()) -> [[Char]] -> IO ()
forall a b. (a -> b) -> a -> b
$ [[Char]]
xss) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Char] -> [Char] -> IO ()
appendFile [Char]
file [Char]
newLineEnding

-- | Is used to print output specified to the 'stdout' or to the 'FilePath' specified as the inner argument in the 'Info2' parameter.
printUniquenessG1
  :: (Show a, Show b) => Info2 -- ^ A parameter to control the predefined behaviour of the printing. The 'I1' branch prints to the 'stdout' and the 'I2' - to the file.
  -> UniquenessG1 a b -- ^ The element, for which the information is printed.
  -> IO ()
printUniquenessG1 :: Info2 -> UniquenessG1 a b -> IO ()
printUniquenessG1 Info2
info UniquenessG1 a b
uni
  | Info2 -> Bool
forall a b. InfoG a b -> Bool
isI1 Info2
info =
      case (\(I1 Info
x) -> Info
x) Info2
info of
        Info
A -> [Char] -> IO ()
putStr [Char]
"" -- nothing is printed
        Info
B -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Info
C -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [[b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Info
D -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Info
E -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Info
F -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Info
G -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [[b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Info
_ -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, Vector b -> [Char]
forall a. Show a => a -> [Char]
show(Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]  -- the most verbose output
  | Bool
otherwise =
      case (\(I2 InfoFile
x) -> InfoFile
x) Info2
info of
        Af [Char]
_ -> [Char] -> IO ()
putStr [Char]
"" -- nothing is printed
        Bf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Cf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [[b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Df [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Ef [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Ff [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        Gf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [[b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]
        ~(Hf [Char]
xs) -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs [[a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni, Vector b -> [Char]
forall a. Show a => a -> [Char]
show(Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> [Char]
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
uni]  -- the most verbose output

-- | Is used to print output specified to the 'stdout' or to the 'FilePath' specified as the inner argument in the 'Info2' parameter.
printUniquenessG1List
  :: (Show a, Show b) => Info2 -- ^ A parameter to control the predefined behaviour of the printing. The 'I1' branch prints to the 'stdout' and the 'I2' - to the file.
  -> [UniquenessG1 a b] -- ^ The list of elements, for which the information is printed.
  -> IO ()
printUniquenessG1List :: Info2 -> [UniquenessG1 a b] -> IO ()
printUniquenessG1List Info2
info (UniquenessG1 a b
y:[UniquenessG1 a b]
ys)
  | Info2 -> Bool
forall a b. InfoG a b -> Bool
isI1 Info2
info =
      case (\(I1 Info
x) -> Info
x) Info2
info of
        Info
A -> [Char] -> IO ()
putStr [Char]
"" -- nothing is printed
        Info
B -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 a b
yUniquenessG1 a b -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. a -> [a] -> [a]
:[UniquenessG1 a b]
ys)
        Info
C -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 a b
yUniquenessG1 a b -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. a -> [a] -> [a]
:[UniquenessG1 a b]
ys)
        Info
D -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 a b
yUniquenessG1 a b -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. a -> [a] -> [a]
:[UniquenessG1 a b]
ys)
        Info
E -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 a b] -> IO ()
forall a b.
(Show a, Show b) =>
Info2 -> [UniquenessG1 a b] -> IO ()
printUniquenessG1List Info2
info [UniquenessG1 a b]
ys
        Info
F -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 a b] -> IO ()
forall a b.
(Show a, Show b) =>
Info2 -> [UniquenessG1 a b] -> IO ()
printUniquenessG1List Info2
info [UniquenessG1 a b]
ys
        Info
G -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 a b] -> IO ()
forall a b.
(Show a, Show b) =>
Info2 -> [UniquenessG1 a b] -> IO ()
printUniquenessG1List Info2
info [UniquenessG1 a b]
ys
        Info
_ -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 a b -> [Char]) -> UniquenessG1 a b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector b -> [Char]
forall a. Show a => a -> [Char]
show(Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 a b -> IO ()) -> UniquenessG1 a b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 a b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 a b] -> IO ()
forall a b.
(Show a, Show b) =>
Info2 -> [UniquenessG1 a b] -> IO ()
printUniquenessG1List Info2
info [UniquenessG1 a b]
ys  -- the most verbose output
  | Bool
otherwise =
      case (\(I2 InfoFile
x) -> InfoFile
x) Info2
info of
        Af [Char]
_ -> [Char] -> IO ()
putStr [Char]
"" -- nothing is printed
        Bf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char])
-> (UniquenessG1 a b -> [a]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 a b
yUniquenessG1 a b -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. a -> [a] -> [a]
:[UniquenessG1 a b]
ys)
        Cf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 a b -> [b]) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 a b
yUniquenessG1 a b -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. a -> [a] -> [a]
:[UniquenessG1 a b]
ys)
        Df [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 a b
yUniquenessG1 a b -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. a -> [a] -> [a]
:[UniquenessG1 a b]
ys)
        Ef [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 a b
t -> ([a] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 UniquenessG1 a b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [b] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 UniquenessG1 a b
t))) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 a b]
ys
        Ff [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 a b
t -> ([a] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 UniquenessG1 a b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Vector b -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 a b
t))) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 a b]
ys
        Gf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 a b
t -> ([b] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 UniquenessG1 a b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Vector b -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 a b
t))) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 a b]
ys
        ~(Hf [Char]
xs) -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 a b] -> [[Char]]) -> [UniquenessG1 a b] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 a b -> [Char]) -> [UniquenessG1 a b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 a b
t -> ([a] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> [a]
forall a b c. (a, b, c) -> c
lastFrom3 UniquenessG1 a b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [b] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 UniquenessG1 a b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Vector b -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 a b
t))) ([UniquenessG1 a b] -> IO ()) -> [UniquenessG1 a b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 a b]
ys  -- the most verbose output
printUniquenessG1List Info2
_ [] = () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- | A variant of the 'printUniquenessG1List' where @a@ is 'Char' so that the inner third arguments in the triples are 'String's.
printUniquenessG1ListStr
  :: (Show b) => Info2 -- ^ A parameter to control the predefined behaviour of the printing. The 'I1' branch prints to the 'stdout' and the 'I2' - to the file.
  -> [UniquenessG1 Char b] -- ^ The list of elements, for which the information is printed.
  -> IO ()
printUniquenessG1ListStr :: Info2 -> [UniquenessG1 Char b] -> IO ()
printUniquenessG1ListStr Info2
info (UniquenessG1 Char b
y:[UniquenessG1 Char b]
ys)
  | Info2 -> Bool
forall a b. InfoG a b -> Bool
isI1 Info2
info =
      case (\(I1 Info
x) -> Info
x) Info2
info of
        Info
A -> [Char] -> IO ()
putStr [Char]
"" -- nothing is printed
        Info
B -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 Char b
yUniquenessG1 Char b
-> [UniquenessG1 Char b] -> [UniquenessG1 Char b]
forall a. a -> [a] -> [a]
:[UniquenessG1 Char b]
ys)
        Info
C -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 Char b -> [b]) -> UniquenessG1 Char b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 Char b
yUniquenessG1 Char b
-> [UniquenessG1 Char b] -> [UniquenessG1 Char b]
forall a. a -> [a] -> [a]
:[UniquenessG1 Char b]
ys)
        Info
D -> ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> IO ()
putStrLn ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 Char b -> Vector b)
-> UniquenessG1 Char b
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 Char b
yUniquenessG1 Char b
-> [UniquenessG1 Char b] -> [UniquenessG1 Char b]
forall a. a -> [a] -> [a]
:[UniquenessG1 Char b]
ys)
        Info
E -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 Char b -> [b]) -> UniquenessG1 Char b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 Char b] -> IO ()
forall b. Show b => Info2 -> [UniquenessG1 Char b] -> IO ()
printUniquenessG1ListStr Info2
info [UniquenessG1 Char b]
ys
        Info
F -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 Char b -> Vector b)
-> UniquenessG1 Char b
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 Char b] -> IO ()
forall b. Show b => Info2 -> [UniquenessG1 Char b] -> IO ()
printUniquenessG1ListStr Info2
info [UniquenessG1 Char b]
ys
        Info
G -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 Char b -> [b]) -> UniquenessG1 Char b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 Char b -> Vector b)
-> UniquenessG1 Char b
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 Char b] -> IO ()
forall b. Show b => Info2 -> [UniquenessG1 Char b] -> IO ()
printUniquenessG1ListStr Info2
info [UniquenessG1 Char b]
ys
        Info
_ -> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 Char b -> [b]) -> UniquenessG1 Char b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Char] -> IO ()
putStrLn ([Char] -> IO ())
-> (UniquenessG1 Char b -> [Char]) -> UniquenessG1 Char b -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector b -> [Char]
forall a. Show a => a -> [Char]
show(Vector b -> [Char])
-> (UniquenessG1 Char b -> Vector b)
-> UniquenessG1 Char b
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 (UniquenessG1 Char b -> IO ()) -> UniquenessG1 Char b -> IO ()
forall a b. (a -> b) -> a -> b
$ UniquenessG1 Char b
y) IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Info2 -> [UniquenessG1 Char b] -> IO ()
forall b. Show b => Info2 -> [UniquenessG1 Char b] -> IO ()
printUniquenessG1ListStr Info2
info [UniquenessG1 Char b]
ys  -- the most verbose output
  | Bool
otherwise =
      case (\(I2 InfoFile
x) -> InfoFile
x) Info2
info of
        Af [Char]
_ -> [Char] -> IO ()
putStr [Char]
"" -- nothing is printed
        Bf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 Char b
yUniquenessG1 Char b
-> [UniquenessG1 Char b] -> [UniquenessG1 Char b]
forall a. a -> [a] -> [a]
:[UniquenessG1 Char b]
ys)
        Cf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([b] -> [Char]
forall a. Show a => a -> [Char]
show ([b] -> [Char])
-> (UniquenessG1 Char b -> [b]) -> UniquenessG1 Char b -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 Char b
yUniquenessG1 Char b
-> [UniquenessG1 Char b] -> [UniquenessG1 Char b]
forall a. a -> [a] -> [a]
:[UniquenessG1 Char b]
ys)
        Df [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (Vector b -> [Char]
forall a. Show a => a -> [Char]
show (Vector b -> [Char])
-> (UniquenessG1 Char b -> Vector b)
-> UniquenessG1 Char b
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ (UniquenessG1 Char b
yUniquenessG1 Char b
-> [UniquenessG1 Char b] -> [UniquenessG1 Char b]
forall a. a -> [a] -> [a]
:[UniquenessG1 Char b]
ys)
        Ef [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 Char b
t -> (UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 UniquenessG1 Char b
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [b] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 UniquenessG1 Char b
t))) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 Char b]
ys
        Ff [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 Char b
t -> (UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 UniquenessG1 Char b
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Vector b -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 Char b
t))) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 Char b]
ys
        Gf [Char]
xs -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 Char b
t -> ([b] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 UniquenessG1 Char b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Vector b -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 Char b
t))) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 Char b]
ys
        ~(Hf [Char]
xs) -> [Char] -> [[Char]] -> IO ()
toFile [Char]
xs ([[Char]] -> IO ())
-> ([UniquenessG1 Char b] -> [[Char]])
-> [UniquenessG1 Char b]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UniquenessG1 Char b -> [Char])
-> [UniquenessG1 Char b] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\UniquenessG1 Char b
t -> (UniquenessG1 Char b -> [Char]
forall a b c. (a, b, c) -> c
lastFrom3 UniquenessG1 Char b
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [b] -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 Char b -> [b]
forall a b c. (a, b, c) -> a
firstFrom3 UniquenessG1 Char b
t) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
newLineEnding [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Vector b -> [Char]
forall a. Show a => a -> [Char]
show (UniquenessG1 Char b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 Char b
t))) ([UniquenessG1 Char b] -> IO ()) -> [UniquenessG1 Char b] -> IO ()
forall a b. (a -> b) -> a -> b
$ [UniquenessG1 Char b]
ys  -- the most verbose output
printUniquenessG1ListStr Info2
_ [] = () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- | Auxiliary printing function to define the line ending needed to be printed by 'printUniquenessG1List' function in some cases.
newLineEnding :: String
newLineEnding :: [Char]
newLineEnding
  | Newline
nativeNewline Newline -> Newline -> Bool
forall a. Eq a => a -> a -> Bool
== Newline
LF = [Char]
"\n"
  | Bool
otherwise = [Char]
"\r\n"

-- | Variant of the 'maximumElBy' function where all the given \"properties\" are used.
-- The predefined library \"properties\" or related to them functions can be found in the package @uniqueness-periods-vector-properties@.
maximumElByAll ::
  (Eq a, Ord b, Show a, Show b) => V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  ->  UniqG2 a b -- ^ The data to be analyzed.
  -> UniquenessG1 a b -- ^ The maximum element according to the given \"properties\".
maximumElByAll :: Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
maximumElByAll Vector ([b] -> b)
vN = Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
forall a b.
(Eq a, Ord b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
maximumElBy (Vector ([b] -> b) -> Int
forall a. Vector a -> Int
V.length Vector ([b] -> b)
vN) Vector ([b] -> b)
vN
{-# INLINE maximumElByAll #-}

-- | The function evaluates
-- the generated 'V.Vector' of 'UniquenessG1' @a@ @b@ elements to retrieve the possibly maximum element in it with respect to the order and significance (principality)
-- of the \"properties\" being evaluated. The most significant and principal is the \"property\", which index in the 'V.Vector' of them is the 'Int' argument of the function
-- minus 1, then less significant is the next to the left \"property\" and so on.
maximumElGBy ::
  (Eq a, Ord b, Show a, Show b) => [a] -- ^ A list of \"whitespace symbols\" that delimits the sublists in the list to be processed.
  -> Preapp a -- ^ A parameter to specify the lists to be prepended and postpended to the given data to be processed before actual processment.
  -> Int -- ^ The quantity of the represented as functions \"properties\" to be applied from the second argument. The order is from the right to the left.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> FuncRep [a] (V.Vector c) [b] -- ^ Since version 0.5.0.0 it includes the previous variant with data constructor 'D2', but additionally allows to use just single argument with data constructor 'U1'
  -> [a] -- ^ The data to be processed. Often it can be a 'String' of the text.
  -> UniquenessG1 a b
maximumElGBy :: [a]
-> Preapp a
-> Int
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> UniquenessG1 a b
maximumElGBy [a]
whspss Preapp a
rr Int
k Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep [a]
xs
 | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k (Vector ([b] -> b) -> Int
forall a. Vector a -> Int
V.length Vector ([b] -> b)
vN) Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = [Char] -> UniquenessG1 a b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.General.Debug.maximumElGBy: undefined for that amount of norms. "
 | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
k Int
0 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT =
   let vM :: Vector (UniquenessG1 a b)
vM = [a]
-> [a]
-> [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
forall a b c.
(Eq a, Ord b) =>
[a]
-> [a]
-> [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector ([b], Vector b, [a])
uniquenessVariants2GNP (Preapp a -> [a]
forall a b. UGG1 a b => a -> [b]
get1m Preapp a
rr) (Preapp a -> [a]
forall a b. UGG1 a b => a -> [b]
get2m Preapp a
rr) [a]
whspss Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep [a]
xs
       maxK :: UniquenessG1 a b
maxK = (UniquenessG1 a b -> UniquenessG1 a b -> Ordering)
-> Vector (UniquenessG1 a b) -> UniquenessG1 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
V.maximumBy (\([b]
_,Vector b
vN0,[a]
_) ([b]
_,Vector b
vN1,[a]
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN1 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))) Vector (UniquenessG1 a b)
vM
       vK :: Vector (UniquenessG1 a b)
vK = (UniquenessG1 a b -> Bool)
-> Vector (UniquenessG1 a b) -> Vector (UniquenessG1 a b)
forall a. (a -> Bool) -> Vector a -> Vector a
V.filter (\([b]
_,Vector b
vN2,[a]
_) -> Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN2 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex (UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 a b
maxK) (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) Vector (UniquenessG1 a b)
vM in
         Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
forall a b.
(Eq a, Ord b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
maximumElBy (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Int -> Int -> Vector ([b] -> b) -> Vector ([b] -> b)
forall a. Int -> Int -> Vector a -> Vector a
V.unsafeSlice Int
0 (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Vector ([b] -> b)
vN) (([UniquenessG1 a b], Vector (UniquenessG1 a b)) -> UniqG2 a b
forall a b. ([a], b) -> UniquenessG2 a b
UL2 ([],Vector (UniquenessG1 a b)
vK))
 | Bool
otherwise = (UniquenessG1 a b -> UniquenessG1 a b -> Ordering)
-> Vector (UniquenessG1 a b) -> UniquenessG1 a b
forall a. (a -> a -> Ordering) -> Vector a -> a
V.maximumBy (\([b]
_,Vector b
vN0,[a]
_) ([b]
_,Vector b
vN1,[a]
_) -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN0 Int
0) (Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
vN1 Int
0)) (Vector (UniquenessG1 a b) -> UniquenessG1 a b)
-> ([a] -> Vector (UniquenessG1 a b)) -> [a] -> UniquenessG1 a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a]
-> Preapp a
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
forall a b c.
(Eq a, Ord b, Show a, Show b) =>
[a]
-> Preapp a
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
uniquenessVariantsGN [a]
whspss Preapp a
rr Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep ([a] -> UniquenessG1 a b) -> [a] -> UniquenessG1 a b
forall a b. (a -> b) -> a -> b
$ [a]
xs

-- | A variant for 'uniquenessVariants2GN' and 'uniquenessVariants2GNP' with the second argument defining, which one is used.
uniquenessVariantsGN ::
  (Eq a, Ord b, Show a, Show b) => [a] -- ^ A list of \"whitespace symbols\" that delimits the sublists in the list to be processed.
  -> Preapp a -- ^ A parameter to specify the lists to be prepended and postpended to the given data to be processed before actual processment.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> FuncRep [a] (V.Vector c) [b] -- ^ Since version 0.5.0.0 it includes the previous variant with data constructor 'D2', but additionally allows to use just single argument with data constructor 'U1'
  -> [a] -- ^ The data to be processed. Often it can be a 'String' of the text.
  -> V.Vector (UniquenessG1 a b)
uniquenessVariantsGN :: [a]
-> Preapp a
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
uniquenessVariantsGN [a]
whspss (PA [a]
ts [a]
us) Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep = [a]
-> [a]
-> [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
forall a b c.
(Eq a, Ord b) =>
[a]
-> [a]
-> [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector ([b], Vector b, [a])
uniquenessVariants2GNP [a]
ts [a]
us [a]
whspss Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep
uniquenessVariantsGN [a]
whspss Preapp a
K Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep = [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
forall a b c.
(Eq a, Ord b) =>
[a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector ([b], Vector b, [a])
uniquenessVariants2GN [a]
whspss Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep
{-# INLINE uniquenessVariantsGN #-}

-- | Finds out the group of maximum elements with respect of the @k@ \"properties\" (the most significant of which is the rightest one, then to the left less significant etc.),
-- which is given as the first argument, and then rearranges the input moving the elements equal by the first element in the triple to the maximum element
-- to the first element in the tuple.
--
-- The last \"property\" is the first element in the 'V.Vector' of \"properties\" (@[b] -> b@).
maximumElByVec ::
  (Eq a, Ord b, Show a, Show b) => Int -- ^ The quantity of the represented as functions \"properties\" to be applied from the second argument. The order is from the right to the left.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> UniqG2 a b -- ^ The data to be analyzed.
  -> UniqG2 a b
maximumElByVec :: Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
maximumElByVec Int
k Vector ([b] -> b)
vN UniqG2 a b
x
 | Vector (UniquenessG1 a b) -> Bool
forall a. Vector a -> Bool
V.null (Vector (UniquenessG1 a b) -> Bool)
-> (UniqG2 a b -> Vector (UniquenessG1 a b)) -> UniqG2 a b -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> Vector (UniquenessG1 a b)
forall a b. (a, b) -> b
snd (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> Bool) -> UniqG2 a b -> Bool
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
x = UniqG2 a b
x
 | Bool
otherwise = let !uniq :: UniquenessG1 a b
uniq = Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
forall a b.
(Eq a, Ord b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniquenessG1 a b
maximumElBy Int
k Vector ([b] -> b)
vN UniqG2 a b
x in let !snD :: Vector b
snD = UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3 UniquenessG1 a b
uniq in ([UniquenessG1 a b], Vector (UniquenessG1 a b)) -> UniqG2 a b
forall a b. ([a], b) -> UniquenessG2 a b
UL2 ((\(!Vector (UniquenessG1 a b)
v1,!Vector (UniquenessG1 a b)
v2) -> ((([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> [UniquenessG1 a b]
forall a b. (a, b) -> a
fst (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> [UniquenessG1 a b])
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> [UniquenessG1 a b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> [UniquenessG1 a b])
-> UniqG2 a b -> [UniquenessG1 a b]
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
x) [UniquenessG1 a b] -> [UniquenessG1 a b] -> [UniquenessG1 a b]
forall a. [a] -> [a] -> [a]
++ Vector (UniquenessG1 a b) -> [UniquenessG1 a b]
forall a. Vector a -> [a]
V.toList Vector (UniquenessG1 a b)
v1,Vector (UniquenessG1 a b)
v2)) ((Vector (UniquenessG1 a b), Vector (UniquenessG1 a b))
 -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> (UniqG2 a b
    -> (Vector (UniquenessG1 a b), Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
      (UniquenessG1 a b -> Bool)
-> Vector (UniquenessG1 a b)
-> (Vector (UniquenessG1 a b), Vector (UniquenessG1 a b))
forall a. (a -> Bool) -> Vector a -> (Vector a, Vector a)
V.unstablePartition (Vector b -> Vector b -> Bool
forall b. Ord b => Vector b -> Vector b -> Bool
equalSnDs Vector b
snD (Vector b -> Bool)
-> (UniquenessG1 a b -> Vector b) -> UniquenessG1 a b -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniquenessG1 a b -> Vector b
forall a b c. (a, b, c) -> b
secondFrom3) (Vector (UniquenessG1 a b)
 -> (Vector (UniquenessG1 a b), Vector (UniquenessG1 a b)))
-> (UniqG2 a b -> Vector (UniquenessG1 a b))
-> UniqG2 a b
-> (Vector (UniquenessG1 a b), Vector (UniquenessG1 a b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([UniquenessG1 a b], Vector (UniquenessG1 a b))
-> Vector (UniquenessG1 a b)
forall a b. (a, b) -> b
snd (([UniquenessG1 a b], Vector (UniquenessG1 a b))
 -> Vector (UniquenessG1 a b))
-> (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b
-> Vector (UniquenessG1 a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b.
UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
get22 (UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b)))
-> UniqG2 a b -> ([UniquenessG1 a b], Vector (UniquenessG1 a b))
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
x)
{-# INLINE maximumElByVec #-}

equalSnDs
  :: Ord b => V.Vector b
  -> V.Vector b
  -> Bool
equalSnDs :: Vector b -> Vector b -> Bool
equalSnDs Vector b
v1 Vector b
v2
 | Vector b -> Bool
forall a. Vector a -> Bool
V.null Vector b
v1 = Vector b -> Bool
forall a. Vector a -> Bool
V.null Vector b
v2
 | Vector b -> Bool
forall a. Vector a -> Bool
V.null Vector b
v2 = Bool
False
 | Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
v1 Int
0 b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== Vector b -> Int -> b
forall a. Vector a -> Int -> a
V.unsafeIndex Vector b
v2 Int
0 = Vector b -> Vector b -> Bool
forall b. Ord b => Vector b -> Vector b -> Bool
equalSnDs (Int -> Int -> Vector b -> Vector b
forall a. Int -> Int -> Vector a -> Vector a
V.unsafeSlice Int
1 (Vector b -> Int
forall a. Vector a -> Int
V.length Vector b
v1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Vector b
v1) (Int -> Int -> Vector b -> Vector b
forall a. Int -> Int -> Vector a -> Vector a
V.unsafeSlice Int
1 (Vector b -> Int
forall a. Vector a -> Int
V.length Vector b
v2 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Vector b
v2)
 | Bool
otherwise = Bool
False

-- | A variant of the 'maximumElByVec' where all the given \"properties\" are used.
maximumElByVecAll ::
  (Eq a, Ord b, Show a, Show b) => V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> UniqG2 a b -- ^ The data to be analyzed.
  -> UniqG2 a b
maximumElByVecAll :: Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
maximumElByVecAll Vector ([b] -> b)
vN = Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
forall a b.
(Eq a, Ord b, Show a, Show b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
maximumElByVec (Vector ([b] -> b) -> Int
forall a. Vector a -> Int
V.length Vector ([b] -> b)
vN) Vector ([b] -> b)
vN
{-# INLINE maximumElByVecAll #-}

-- |  Finds out the @n@ (the first 'Int' argument) consequential maximum elements, and then rearranges the input moving the elements equal by the first element
-- in the triple to the maximum element to the first element in the tuple.
uniqNPropertiesN ::
  (Eq a, Ord b, Show a, Show b) => Int -- ^ A quantity of the recursive calls that returns each one a new resulting group from the rest of the data processed.
  -> Int -- ^ The quantity of the represented as functions \"properties\" to be applied from the second argument. The order is from the right to the left.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> UniqG2 a b -- ^ The data to be analyzed.
  -> UniqG2 a b
uniqNPropertiesN :: Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
uniqNPropertiesN Int
n Int
k Vector ([b] -> b)
vN UniqG2 a b
y
 | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = UniqG2 a b
y
 | Bool
otherwise = Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
forall a b.
(Eq a, Ord b, Show a, Show b) =>
Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
uniqNPropertiesN (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int
k Vector ([b] -> b)
vN (UniqG2 a b -> UniqG2 a b)
-> (UniqG2 a b -> UniqG2 a b) -> UniqG2 a b -> UniqG2 a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
forall a b.
(Eq a, Ord b, Show a, Show b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
maximumElByVec Int
k Vector ([b] -> b)
vN (UniqG2 a b -> UniqG2 a b) -> UniqG2 a b -> UniqG2 a b
forall a b. (a -> b) -> a -> b
$ UniqG2 a b
y
{-# INLINABLE uniqNPropertiesN #-}

-- | A variant of the 'uniqNPropertiesN' where all the given \"properties\" are used.
uniqNPropertiesNAll ::
  (Eq a, Ord b, Show a, Show b) => Int -- ^ A quantity of the recursive calls that returns each one a new resulting group from the rest of the data processed.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> UniqG2 a b -- ^ The data to be analyzed.
  -> UniqG2 a b
uniqNPropertiesNAll :: Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
uniqNPropertiesNAll Int
n Vector ([b] -> b)
vN = Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
forall a b.
(Eq a, Ord b, Show a, Show b) =>
Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
uniqNPropertiesN Int
n (Vector ([b] -> b) -> Int
forall a. Vector a -> Int
V.length Vector ([b] -> b)
vN) Vector ([b] -> b)
vN
{-# INLINE uniqNPropertiesNAll #-}

--------------------------------------------------------------------------------------------

-- | The full analyzing and processment function.
uniqNProperties2GN ::
  (Eq a, Ord b, Show a, Show b) => [a] -- ^ A list of \"whitespace symbols\" that delimits the sublists in the list to be processed.
  -> Preapp a -- ^ A parameter to specify the lists to be prepended and postpended to the given data to be processed before actual processment.
  -> Int -- ^ A quantity of the recursive calls that returns each one a new resulting group from the rest of the data processed.
  -> Int -- ^ The quantity of the represented as functions \"properties\" to be applied from the second argument. The order is from the right to the left.
  -> V.Vector ([b] -> b) -- ^ 'V.Vector' of the represented as functions \"properties\" to be applied consequently.
  -> FuncRep [a] (V.Vector c) [b] -- ^ Since version 0.5.0.0 it includes the previous variant with data constructor 'D2', but additionally allows to use just single argument with data constructor 'U1'
  -> [a] -- ^ The data to be processed. Often it can be a 'String' of the text.
  -> UniqG2 a b
uniqNProperties2GN :: [a]
-> Preapp a
-> Int
-> Int
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> UniqG2 a b
uniqNProperties2GN [a]
whspss Preapp a
rr Int
n Int
k Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep [a]
xs
 | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = ([UniquenessG1 a b], Vector (UniquenessG1 a b)) -> UniqG2 a b
forall a b. ([a], b) -> UniquenessG2 a b
UL2 ([],Vector (UniquenessG1 a b)
forall a. Vector a
V.empty)
 | Bool
otherwise = let v :: Vector (UniquenessG1 a b)
v = [a]
-> [a]
-> [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector (UniquenessG1 a b)
forall a b c.
(Eq a, Ord b) =>
[a]
-> [a]
-> [a]
-> Vector ([b] -> b)
-> FuncRep [a] (Vector c) [b]
-> [a]
-> Vector ([b], Vector b, [a])
uniquenessVariants2GNP (Preapp a -> [a]
forall a b. UGG1 a b => a -> [b]
get1m Preapp a
rr) (Preapp a -> [a]
forall a b. UGG1 a b => a -> [b]
get2m Preapp a
rr) [a]
whspss Vector ([b] -> b)
vN FuncRep [a] (Vector c) [b]
frep [a]
xs in Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
forall a b.
(Eq a, Ord b, Show a, Show b) =>
Int -> Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
uniqNPropertiesN (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int
k Vector ([b] -> b)
vN (UniqG2 a b -> UniqG2 a b)
-> (UniqG2 a b -> UniqG2 a b) -> UniqG2 a b -> UniqG2 a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
forall a b.
(Eq a, Ord b, Show a, Show b) =>
Int -> Vector ([b] -> b) -> UniqG2 a b -> UniqG2 a b
maximumElByVec Int
k Vector ([b] -> b)
vN (UniqG2 a b -> UniqG2 a b) -> UniqG2 a b -> UniqG2 a b
forall a b. (a -> b) -> a -> b
$ (([UniquenessG1 a b], Vector (UniquenessG1 a b)) -> UniqG2 a b
forall a b. ([a], b) -> UniquenessG2 a b
UL2 ([],Vector (UniquenessG1 a b)
v))