module Data.RangeMin.Mixed (MixVector, MMixVector, zip, unzip) where
import Data.RangeMin.Mixed.Mutable
import Data.Vector.Generic hiding (zip, unzip)
import Prelude hiding (zip, unzip)
data MixVector v1 v2 x where
Mix :: !Int -> !(v1 a) -> !(v2 b) -> MixVector v1 v2 (a, b)
type instance Mutable (MixVector v1 v2) = MMixVector (Mutable v1) (Mutable v2)
instance (Vector v1 a, Vector v2 b) => Vector (MixVector v1 v2) (a, b) where
unsafeFreeze (MMix n v1 v2) = do
v1' <- unsafeFreeze v1
v2' <- unsafeFreeze v2
return (Mix n v1' v2')
basicLength (Mix n _ _) = n
basicUnsafeSlice !i !k (Mix _ v1 v2) =
Mix k (basicUnsafeSlice i k v1) (basicUnsafeSlice i k v2)
basicUnsafeIndexM (Mix _ v1 v2) !i = do
a <- basicUnsafeIndexM v1 i
b <- basicUnsafeIndexM v2 i
return (a, b)
basicUnsafeCopy (MMix _ v1D v2D) (Mix _ v1S v2S) = do
basicUnsafeCopy v1D v1S
basicUnsafeCopy v2D v2S
zip :: (Vector v1 a1, Vector v2 a2) => v1 a1 -> v2 a2 -> MixVector v1 v2 (a1, a2)
zip xs ys = Mix (basicLength xs) xs ys
unzip :: MixVector v1 v2 (a1, a2) -> (v1 a1, v2 a2)
unzip (Mix _ xs ys) = (xs, ys)