module Data.RangeMin.Mixed.Mutable where
import Data.Vector.Generic.Mutable
data MMixVector v1 v2 s x where
MMix :: !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
basicUnsafeSlice !i !k (MMix _ v1 v2) =
MMix k (basicUnsafeSlice i k v1) (basicUnsafeSlice i k v2)
basicOverlaps (MMix _ v11 v21) (MMix _ v12 v22) =
basicOverlaps v11 v12 || basicOverlaps v21 v22
basicUnsafeNew !n = do
!v1 <- basicUnsafeNew n
!v2 <- basicUnsafeNew n
return (MMix n v1 v2)
basicUnsafeRead (MMix _ v1 v2) !i = do
a <- basicUnsafeRead v1 i
b <- basicUnsafeRead v2 i
return (a, b)
basicUnsafeNewWith !n (a, b) = do
!v1 <- basicUnsafeNewWith n a
!v2 <- basicUnsafeNewWith n b
return (MMix n v1 v2)
basicUnsafeWrite (MMix _ v1 v2) !i (a, b) = do
basicUnsafeWrite v1 i a
basicUnsafeWrite v2 i b
basicClear (MMix _ v1 v2) = do
basicClear v1
basicClear v2
basicSet (MMix _ v1 v2) (a, b) = do
basicSet v1 a
basicSet v2 b
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')