{-# LANGUAGE CPP, BangPatterns #-}
module Languages.UniquenessPeriods.Vector.StrictV where
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=804
/* code that applies only to GHC 8.4.* and higher versions */
import Data.Semigroup ((<>))
import Prelude hiding ((<>))
#endif
#endif
import qualified Data.Vector as V
import qualified Data.List as L (permutations,intersperse)
uniquenessVariants2GN ::
(Eq a, Ord b) => [a]
-> V.Vector ([b] -> b)
-> ([a] -> V.Vector c)
-> (V.Vector c -> [b])
-> [a]
-> V.Vector ([b],V.Vector b, [a])
uniquenessVariants2GN whspss vN g1 g2 !xs = uniquenessVariants2GNP [] [] whspss vN g1 g2 xs
{-# INLINE uniquenessVariants2GN #-}
uniquenessVariants2GNP ::
(Eq a, Ord b) => [a]
-> [a]
-> [a]
-> V.Vector ([b] -> b)
-> ([a] -> V.Vector c)
-> (V.Vector c -> [b])
-> [a]
-> V.Vector ([b],V.Vector b, [a])
uniquenessVariants2GNP !ts !us whspss vN g1 g2 !xs
| null . sublistsG whspss $ xs = V.empty
| not . null $ whspss = let !v0 = V.fromList . take 8 . sublistsG whspss $ xs in
V.fromList . map ((\vs -> let !rs = g2 . g1 $ vs in (rs, (V.map (\f -> f rs) vN), vs)) . concat . L.intersperse (take 1 whspss) . preAppend ts [us] . V.toList .
V.backpermute v0 . V.fromList) . L.permutations $ ([0..(V.length v0 - 1)]::[Int])
| otherwise = error "Languages.UniquenessPeriods.Vector.StrictV.uniquenessVariants2GNP: undefined for the empty third argument. "
sublistsG :: Eq a => [a] -> [a] -> [[a]]
sublistsG whspss xs =
case dropWhile (`elem` whspss) xs of
[] -> []
s' -> w : sublistsG whspss s''
where (w, s'') = break (`elem` whspss) s'
preAppend :: [a] -> [[a]] -> [[a]] -> [[a]]
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=804
preAppend ts !uss tss = ts:tss <> uss
#endif
#endif
#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__<804
preAppend ts !uss tss = ts:tss ++ uss
#endif
#endif
{-# INLINE preAppend #-}