{-# LANGUAGE FlexibleContexts, BangPatterns #-}

module Data.RangeMin.Int.Catalan.Combinators where

import Data.RangeMin.Common.Combinators
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