{-# 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.RangeMin.Fusion as F {-# INLINE equivClasses #-} equivClasses :: (Vector v a, Vector v (Int, a)) => Int -> v (Int, a) -> v a equivClasses !n str = create $ do !done <- UM.unsafeNewWith n False !out <- new n F.mapM_ (\ (i, x) -> do amDone <- read done i unless amDone $ do write done i True write out i $! x) str return out