{-# LANGUAGE BangPatterns, MultiParamTypeClasses, GADTs #-}
module Data.RangeMin.Mixed.Mutable where

import Data.Vector.Generic.Mutable

data MMixVector v1 v2 s x where
	MMix :: {-# UNPACK #-} !Int -> !(v1 s a) -> !(v2 s b) -> MMixVector v1 v2 s (a, b)

instance (MVector v1 a, MVector v2 b) => MVector (MMixVector v1 v2) (a, b) where
	basicLength (MMix n _ _) = n
	{-# INLINE basicUnsafeSlice #-}
	basicUnsafeSlice !i !k (MMix _ v1 v2) =
		MMix k (basicUnsafeSlice i k v1) (basicUnsafeSlice i k v2)
	{-# INLINE basicOverlaps #-}
	basicOverlaps (MMix _ v11 v21) (MMix _ v12 v22) =
		basicOverlaps v11 v12 || basicOverlaps v21 v22
	{-# INLINE basicUnsafeNew #-}
	basicUnsafeNew !n = do
		!v1 <- basicUnsafeNew n
		!v2 <- basicUnsafeNew n
		return (MMix n v1 v2)
	{-# INLINE basicUnsafeRead #-}
	basicUnsafeRead (MMix _ v1 v2) !i = do
		a <- basicUnsafeRead v1 i
		b <- basicUnsafeRead v2 i
		return (a, b)
	{-# INLINE basicUnsafeNewWith #-}
	basicUnsafeNewWith !n (a, b) = do
		!v1 <- basicUnsafeNewWith n a
		!v2 <- basicUnsafeNewWith n b
		return (MMix n v1 v2)
	{-# INLINE basicUnsafeWrite #-}
	basicUnsafeWrite (MMix _ v1 v2) !i (a, b) = do
		basicUnsafeWrite v1 i a
		basicUnsafeWrite v2 i b
	{-# INLINE basicClear #-}
	basicClear (MMix _ v1 v2) = do
		basicClear v1
		basicClear v2
	{-# INLINE basicSet #-}
	basicSet (MMix _ v1 v2) (a, b) = do
		basicSet v1 a
		basicSet v2 b
	{-# INLINE basicUnsafeCopy #-}
	basicUnsafeCopy (MMix _ v11 v21) (MMix _ v12 v22) = do
		basicUnsafeCopy v11 v12
		basicUnsafeCopy v21 v22
	basicUnsafeGrow (MMix n v1 v2) !k = do
		v1' <- basicUnsafeGrow v1 k
		v2' <- basicUnsafeGrow v2 k
		return (MMix (n+k) v1' v2')