{-# LANGUAGE CPP #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ScopedTypeVariables #-}
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(x,y,z) 1
#endif
module Data.Vector.Hybrid.Mutable
( MVector
, IOVector
, STVector
, length, null
, slice, init, tail, take, drop
, unsafeSlice, unsafeInit, unsafeTail, unsafeTake, unsafeDrop
, overlaps
, new, unsafeNew, replicate, clone
, grow, unsafeGrow
, clear
, read, write, swap
, unsafeRead, unsafeWrite, unsafeSwap
, set, copy, unsafeCopy
, unsafeZip, projectFst, projectSnd
, newWith, unsafeNewWith
) where
import Control.Monad.Primitive
import qualified Data.Vector.Generic.Mutable as G
import Data.Vector.Hybrid.Internal
import Prelude hiding ( length, null, replicate, reverse, map, read, take, drop, init, tail )
type IOVector u v = MVector u v RealWorld
type STVector = MVector
length :: G.MVector u a => MVector u v s (a, b) -> Int
length :: forall (u :: * -> * -> *) a (v :: * -> * -> *) s b.
MVector u a =>
MVector u v s (a, b) -> Int
length (MV u s a
ks v s b
_) = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Int
G.length u s a
ks
{-# INLINE length #-}
null :: G.MVector u a => MVector u v s (a, b) -> Bool
null :: forall (u :: * -> * -> *) a (v :: * -> * -> *) s b.
MVector u a =>
MVector u v s (a, b) -> Bool
null (MV u s a
ks v s b
_) = forall (v :: * -> * -> *) a s. MVector v a => v s a -> Bool
G.null u s a
ks
{-# INLINE null #-}
slice :: (G.MVector u a, G.MVector v b) => Int -> Int -> MVector u v s (a, b) -> MVector u v s (a, b)
slice :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
Int -> Int -> MVector u v s (a, b) -> MVector u v s (a, b)
slice = forall (v :: * -> * -> *) a s.
(HasCallStack, MVector v a) =>
Int -> Int -> v s a -> v s a
G.slice
{-# INLINE slice #-}
take :: (G.MVector u a, G.MVector v b) => Int -> MVector u v s (a, b) -> MVector u v s (a, b)
take :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
Int -> MVector u v s (a, b) -> MVector u v s (a, b)
take = forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
G.take
{-# INLINE take #-}
drop :: (G.MVector u a, G.MVector v b) => Int -> MVector u v s (a, b) -> MVector u v s (a, b)
drop :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
Int -> MVector u v s (a, b) -> MVector u v s (a, b)
drop = forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
G.drop
{-# INLINE drop #-}
init :: (G.MVector u a, G.MVector v b) => MVector u v s (a, b) -> MVector u v s (a, b)
init :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
MVector u v s (a, b) -> MVector u v s (a, b)
init = forall (v :: * -> * -> *) a s. MVector v a => v s a -> v s a
G.init
{-# INLINE init #-}
tail :: (G.MVector u a, G.MVector v b) => MVector u v s (a, b) -> MVector u v s (a, b)
tail :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
MVector u v s (a, b) -> MVector u v s (a, b)
tail = forall (v :: * -> * -> *) a s. MVector v a => v s a -> v s a
G.tail
{-# INLINE tail #-}
unsafeSlice :: (G.MVector u a, G.MVector v b)
=> Int
-> Int
-> MVector u v s (a, b)
-> MVector u v s (a, b)
unsafeSlice :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
Int -> Int -> MVector u v s (a, b) -> MVector u v s (a, b)
unsafeSlice = forall (v :: * -> * -> *) a s.
MVector v a =>
Int -> Int -> v s a -> v s a
G.unsafeSlice
{-# INLINE unsafeSlice #-}
unsafeTake :: (G.MVector u a, G.MVector v b) => Int -> MVector u v s (a, b) -> MVector u v s (a, b)
unsafeTake :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
Int -> MVector u v s (a, b) -> MVector u v s (a, b)
unsafeTake = forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
G.unsafeTake
{-# INLINE unsafeTake #-}
unsafeDrop :: (G.MVector u a, G.MVector v b) => Int -> MVector u v s (a, b) -> MVector u v s (a, b)
unsafeDrop :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
Int -> MVector u v s (a, b) -> MVector u v s (a, b)
unsafeDrop = forall (v :: * -> * -> *) a s. MVector v a => Int -> v s a -> v s a
G.unsafeDrop
{-# INLINE unsafeDrop #-}
unsafeInit :: (G.MVector u a, G.MVector v b) => MVector u v s (a, b) -> MVector u v s (a, b)
unsafeInit :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
MVector u v s (a, b) -> MVector u v s (a, b)
unsafeInit = forall (v :: * -> * -> *) a s. MVector v a => v s a -> v s a
G.unsafeInit
{-# INLINE unsafeInit #-}
unsafeTail :: (G.MVector u a, G.MVector v b) => MVector u v s (a, b) -> MVector u v s (a, b)
unsafeTail :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
MVector u v s (a, b) -> MVector u v s (a, b)
unsafeTail = forall (v :: * -> * -> *) a s. MVector v a => v s a -> v s a
G.unsafeTail
{-# INLINE unsafeTail #-}
overlaps :: (G.MVector u a, G.MVector v b) => MVector u v s (a, b) -> MVector u v s (a, b) -> Bool
overlaps :: forall (u :: * -> * -> *) a (v :: * -> * -> *) b s.
(MVector u a, MVector v b) =>
MVector u v s (a, b) -> MVector u v s (a, b) -> Bool
overlaps = forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> v s a -> Bool
G.overlaps
{-# INLINE overlaps #-}
new :: (PrimMonad m, G.MVector u a, G.MVector v b) => Int -> m (MVector u v (PrimState m) (a, b))
new :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
Int -> m (MVector u v (PrimState m) (a, b))
new = forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
G.new
{-# INLINE new #-}
unsafeNew :: (PrimMonad m, G.MVector u a, G.MVector v b) => Int -> m (MVector u v (PrimState m) (a, b))
unsafeNew :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
Int -> m (MVector u v (PrimState m) (a, b))
unsafeNew = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
G.unsafeNew
{-# INLINE unsafeNew #-}
replicate :: (PrimMonad m, G.MVector u a, G.MVector v b) => Int -> (a, b) -> m (MVector u v (PrimState m) (a, b))
replicate :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
Int -> (a, b) -> m (MVector u v (PrimState m) (a, b))
replicate = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> a -> m (v (PrimState m) a)
G.replicate
{-# INLINE replicate #-}
clone :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> m (MVector u v (PrimState m) (a, b))
clone :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b)
-> m (MVector u v (PrimState m) (a, b))
clone = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> m (v (PrimState m) a)
G.clone
{-# INLINE clone #-}
grow :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> m (MVector u v (PrimState m) (a, b))
grow :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b)
-> Int -> m (MVector u v (PrimState m) (a, b))
grow = forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m (v (PrimState m) a)
G.grow
{-# INLINE grow #-}
unsafeGrow :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> m (MVector u v (PrimState m) (a, b))
unsafeGrow :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b)
-> Int -> m (MVector u v (PrimState m) (a, b))
unsafeGrow = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m (v (PrimState m) a)
G.unsafeGrow
{-# INLINE unsafeGrow #-}
clear :: (PrimMonad m, G.MVector u a, G.MVector v b) => MVector u v (PrimState m) (a, b) -> m ()
clear :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> m ()
clear = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> m ()
G.clear
{-# INLINE clear #-}
read :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> m (a, b)
read :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> Int -> m (a, b)
read = forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
G.read
{-# INLINE read #-}
write :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> (a, b) -> m ()
write :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> Int -> (a, b) -> m ()
write = forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
G.write
{-# INLINE write #-}
swap :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> Int -> m ()
swap :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> Int -> Int -> m ()
swap = forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> Int -> m ()
G.swap
{-# INLINE swap #-}
unsafeRead :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> m (a, b)
unsafeRead :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> Int -> m (a, b)
unsafeRead = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> m a
G.unsafeRead
{-# INLINE unsafeRead #-}
unsafeWrite :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> (a, b) -> m ()
unsafeWrite :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> Int -> (a, b) -> m ()
unsafeWrite = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
G.unsafeWrite
{-# INLINE unsafeWrite #-}
unsafeSwap
:: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> Int -> Int -> m ()
unsafeSwap :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> Int -> Int -> m ()
unsafeSwap = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> Int -> m ()
G.unsafeSwap
{-# INLINE unsafeSwap #-}
set :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> (a, b) -> m ()
set :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b) -> (a, b) -> m ()
set = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> a -> m ()
G.set
{-# INLINE set #-}
copy :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b) -> MVector u v (PrimState m) (a, b) -> m ()
copy :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b)
-> MVector u v (PrimState m) (a, b) -> m ()
copy = forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
G.copy
{-# INLINE copy #-}
unsafeCopy :: (PrimMonad m, G.MVector u a, G.MVector v b)
=> MVector u v (PrimState m) (a, b)
-> MVector u v (PrimState m) (a, b)
-> m ()
{-# INLINE unsafeCopy #-}
unsafeCopy :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
MVector u v (PrimState m) (a, b)
-> MVector u v (PrimState m) (a, b) -> m ()
unsafeCopy = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
G.unsafeCopy
unsafeZip :: u s a -> v s b -> MVector u v s (a, b)
unsafeZip :: forall (u :: * -> * -> *) s a (v :: * -> * -> *) b.
u s a -> v s b -> MVector u v s (a, b)
unsafeZip = forall (u :: * -> * -> *) s a (v :: * -> * -> *) b.
u s a -> v s b -> MVector u v s (a, b)
MV
{-# INLINE unsafeZip #-}
projectFst :: MVector u v s (a, b) -> u s a
projectFst :: forall (u :: * -> * -> *) (v :: * -> * -> *) s a b.
MVector u v s (a, b) -> u s a
projectFst (MV u s a
ks v s b
_) = u s a
ks
{-# INLINE projectFst #-}
projectSnd :: MVector u v s (a, b) -> v s b
projectSnd :: forall (u :: * -> * -> *) (v :: * -> * -> *) s a b.
MVector u v s (a, b) -> v s b
projectSnd (MV u s a
_ v s b
vs) = v s b
vs
{-# INLINE projectSnd #-}
newWith :: (PrimMonad m, G.MVector u a, G.MVector v b) => Int -> (a, b) -> m (MVector u v (PrimState m) (a, b))
newWith :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
Int -> (a, b) -> m (MVector u v (PrimState m) (a, b))
newWith = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> a -> m (v (PrimState m) a)
G.replicate
{-# INLINE newWith #-}
unsafeNewWith :: (PrimMonad m, G.MVector u a, G.MVector v b) => Int -> (a, b) -> m (MVector u v (PrimState m) (a, b))
unsafeNewWith :: forall (m :: * -> *) (u :: * -> * -> *) a (v :: * -> * -> *) b.
(PrimMonad m, MVector u a, MVector v b) =>
Int -> (a, b) -> m (MVector u v (PrimState m) (a, b))
unsafeNewWith = forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
Int -> a -> m (v (PrimState m) a)
G.replicate
{-# INLINE unsafeNewWith #-}
{-# DEPRECATED newWith, unsafeNewWith "Use replicate instead" #-}