{-# LANGUAGE FlexibleContexts, BangPatterns #-} module Data.RangeMin.Int.Catalan.Combinators where import Control.Monad import Data.RangeMin.Common.Vector import Prelude hiding (read) import qualified Data.Vector.Unboxed.Mutable as UM import qualified Data.Vector.Generic as G {-# INLINE equivClasses #-} equivClasses :: (Vector v a, Vector v (Int, a)) => Int -> v (Int, a) -> v a equivClasses !n str = inlineCreate $ do !done <- UM.unsafeNewWith n False !out <- new n G.mapM_ (\ (i, x) -> do amDone <- read done i unless amDone $ do write done i True write out i x) str return out