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