-- | -- 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. module Languages.UniquenessPeriods.Vector.General.Debug where import Data.Maybe (fromJust) import Data.Char (isPunctuation) import qualified Data.Vector as V import Languages.UniquenessPeriods.Vector.Auxiliary import String.Languages.UniquenessPeriods.Vector import Languages.UniquenessPeriods.Vector.StrictV import Languages.UniquenessPeriods.Vector.Data -- | uniqMaxPoeticalGNV :: (Eq a, Ord b) => Int -> V.Vector ([b] -> b) -> UniqG a b -> UniquenessG1 a b uniqMaxPoeticalGNV k vN y | compare k (V.length vN) == GT = error "Languages.UniquenessPeriods.Vector.General.Debug.uniqMaxPoeticalGNV: undefined for that amount of norms. " | compare k 0 == GT = let maxK = V.maximumBy (\(_,vN0,_) (_,vN1,_) -> compare (V.unsafeIndex vN0 (k - 1)) (V.unsafeIndex vN1 (k - 1))) . snd . get2 $ y vK = V.filter (\(_,vN2,_) -> V.unsafeIndex vN2 (k - 1) == ((\(_,vNk,_) -> V.unsafeIndex vNk (k - 1)) maxK)) . snd . get2 $ y in if isU y then uniqMaxPoeticalGNV (k - 1) (V.unsafeSlice 0 (V.length vN - 1) vN) (U vK) else uniqMaxPoeticalGNV (k - 1) (V.unsafeSlice 0 (V.length vN - 1) vN) (UL (fromJust . fst . get2 $ y,vK)) | otherwise = V.maximumBy (\(_,vN0,_) (_,vN1,_) -> compare (V.unsafeIndex vN0 0) (V.unsafeIndex vN1 0)) . snd . get2 $ y {-# INLINE uniqMaxPoeticalGNV #-} -- | inner1 :: (Eq a, Ord b, Show a, Show b) => Int -> V.Vector ([b] -> b) -> UniqG a b -> IO ([b],UniqG a b) inner1 k vN x = do let uniq = uniqMaxPoeticalGNV k vN x let fsT = (\(ys,_,_) -> ys) uniq putStrLn . show . lastFrom3 $ uniq putStrLn . show . firstFrom3 $ uniq putStrLn . show . secondFrom3 $ uniq return (fsT,x) {-# INLINE inner1 #-} -- | uniqMaxPoeticalGNVL :: (Eq a, Ord b, Show a, Show b) => V.Vector ([b] -> b) -> UniqG a b -> UniquenessG1 a b uniqMaxPoeticalGNVL vN = uniqMaxPoeticalGNV (V.length vN) vN {-# INLINE uniqMaxPoeticalGNVL #-} -- | uniqMaxPoetical2GN :: (Eq a, Ord b, Show a, Show b) => [a] -> Preapp a -> Int -> V.Vector ([b] -> b) -> ([a] -> V.Vector c) -> (V.Vector c -> [b]) -> [a] -> UniquenessG1 a b uniqMaxPoetical2GN whspss rr k vN g1 g2 xs | compare k (V.length vN) == GT = error "Languages.UniquenessPeriods.Vector.General.Debug.uniqMaxPoetical2GN: undefined for that amount of norms. " | compare k 0 == GT = let vM = uniquenessVariants2GNP (get1m rr) (get2m rr) whspss vN g1 g2 xs maxK = V.maximumBy (\(_,vN0,_) (_,vN1,_) -> compare (V.unsafeIndex vN0 (k - 1)) (V.unsafeIndex vN1 (k - 1))) vM vK = V.filter (\(_,vN2,_) -> V.unsafeIndex vN2 (k - 1) == ((\(_,vNk,_) -> V.unsafeIndex vNk (k - 1)) maxK)) vM in uniqMaxPoeticalGNV (k - 1) (V.unsafeSlice 0 (V.length vN - 1) vN) (U vK) | otherwise = V.maximumBy (\(_,vN0,_) (_,vN1,_) -> compare (V.unsafeIndex vN0 0) (V.unsafeIndex vN1 0)) . uniquenessVariantsGN whspss rr vN g1 g2 $ xs -- | uniquenessVariantsGN :: (Eq a, Ord b, Show a, Show b) => [a] -> Preapp a -> V.Vector ([b] -> b) -> ([a] -> V.Vector c) -> (V.Vector c -> [b]) -> [a] -> V.Vector (UniquenessG1 a b) uniquenessVariantsGN whspss (PA ts us) vN g1 g2 = uniquenessVariants2GNP ts us whspss vN g1 g2 uniquenessVariantsGN whspss K vN g1 g2 = uniquenessVariants2GN whspss vN g1 g2 {-# INLINE uniquenessVariantsGN #-} -- | uniqInMaxPoeticalN :: (Eq a, Ord b, Show a, Show b) => Int -> V.Vector ([b] -> b) -> UniqG a b -> IO (UniqG a b) uniqInMaxPoeticalN k vN x = do inner1 k vN x >>= \(fsT,x) -> if isU x then return (U (V.filter (\(xs,_,_) -> xs /= fsT) . snd . get2 $ x)) else return (UL ((\(v1,v2) -> ((V.toList . V.map lastFrom3 $ v1) ++ (fromJust . fst . get2 $ x),v2)) . V.unstablePartition (\(xs,_,_) -> xs == fsT) . snd . get2 $ x)) {-# INLINE uniqInMaxPoeticalN #-} -- | uniqInMaxPoeticalNL :: (Eq a, Ord b, Show a, Show b) => V.Vector ([b] -> b) -> UniqG a b -> IO (UniqG a b) uniqInMaxPoeticalNL vN = uniqInMaxPoeticalN (V.length vN) vN {-# INLINE uniqInMaxPoeticalNL #-} -- | uniqNPoeticalN :: (Eq a, Ord b, Show a, Show b) => Int -> Int -> V.Vector ([b] -> b) -> UniqG a b -> IO () uniqNPoeticalN n k vN y | n <= 0 = return () | compare (V.length . snd . get2 $ y) n == LT = V.mapM_ (\x -> do { putStrLn . show . lastFrom3 $ x ; putStrLn . show . firstFrom3 $ x ; putStrLn . show . secondFrom3 $ x}) . snd . get2 $ y | otherwise = (uniqInMaxPoeticalN k vN y >>= uniqNPoeticalN (n - 1) k vN) {-# INLINE uniqNPoeticalN #-} -- | uniqNPoeticalNL :: (Eq a, Ord b, Show a, Show b) => Int -> V.Vector ([b] -> b) -> UniqG a b -> IO () uniqNPoeticalNL n vN = uniqNPoeticalN n (V.length vN) vN {-# INLINE uniqNPoeticalNL #-} -- | uniqNPoeticalVN :: (Eq a, Ord b, Show a, Show b) => Int -> Int -> V.Vector ([b] -> b) -> UniqG a b -> IO (UniqG a b) uniqNPoeticalVN n k vN y | n <= 0 || compare (V.length . snd . get2 $ y) n == LT = return y | otherwise = (uniqInMaxPoeticalN k vN y >>= uniqNPoeticalVN (n - 1) k vN) {-# INLINE uniqNPoeticalVN #-} -- | uniqNPoeticalVNL :: (Eq a, Ord b, Show a, Show b) => Int -> V.Vector ([b] -> b) -> UniqG a b -> IO (UniqG a b) uniqNPoeticalVNL n vN = uniqNPoeticalVN n (V.length vN) vN {-# INLINE uniqNPoeticalVNL #-} -------------------------------------------------------------------------------------------- -- | uniqNPoetical2GN :: (Eq a, Ord b, Show a, Show b) => [a] -> Preapp a -> Int -> Int -> V.Vector ([b] -> b) -> ([a] -> V.Vector c) -> (V.Vector c -> [b]) -> [a] -> IO () uniqNPoetical2GN whspss rr n k vN g1 g2 xs | n <= 0 = return () | otherwise = do let v = uniquenessVariants2GNP whspss (get1m rr) (get2m rr) vN g1 g2 xs if compare (V.length v) n == LT then V.mapM_ (\x -> do { putStrLn . show . lastFrom3 $ x ; putStrLn . show . firstFrom3 $ x ; putStrLn . show . secondFrom3 $ x}) v else (uniqInMaxPoeticalN k vN (U v) >>= uniqNPoeticalN (n - 1) k vN) -- | uniqNPoetical2VGN :: (Eq a, Ord b, Show a, Show b) => [a] -> Preapp a -> Int -> Int -> V.Vector ([b] -> b) -> ([a] -> V.Vector c) -> (V.Vector c -> [b]) -> UniqG a b -> [a] -> IO (UniqG a b) uniqNPoetical2VGN whspss rr n k vN g1 g2 y xs | n <= 0 = if isU y then return (U V.empty) else return (UL ([],V.empty)) | otherwise = do let v = uniquenessVariants2GNP whspss (get1m rr) (get2m rr) vN g1 g2 xs if compare (V.length v) n == LT then if isU y then return (U v) else return (UL ([],v)) else if isU y then uniqNPoeticalVN n k vN (U v) else uniqNPoeticalVN n k vN (UL ([],v))