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