{-# 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