module Data.Vector.Generic.Sized
( Vector
, fromVector
, replicate
, singleton
, generate
, generateM
, length
, index
, head
, last
, tail
, init
, take
, drop
, map
, imapM_
, foldl'
, foldl1'
) where
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Storable as VS
import GHC.TypeLits
import Data.Proxy
import Control.DeepSeq
import Foreign.Storable
import Foreign.Ptr (castPtr)
import Prelude hiding (replicate, head, last,
tail, init, map, length, drop, take)
newtype Vector v (n :: Nat) a = Vector (v a)
deriving (Show, Eq, Ord, Foldable, NFData)
instance (KnownNat n, Storable a)
=> Storable (Vector VS.Vector n a) where
sizeOf _ = sizeOf (undefined :: a) * fromIntegral (natVal (Proxy :: Proxy n))
alignment _ = alignment (undefined :: a)
peek ptr = generateM (Proxy :: Proxy n) (peekElemOff (castPtr ptr))
poke ptr = imapM_ (pokeElemOff (castPtr ptr))
fromVector :: forall a v (n :: Nat). (KnownNat n, VG.Vector v a)
=> v a -> Maybe (Vector v n a)
fromVector v
| n' == fromIntegral (VG.length v) = Just (Vector v)
| otherwise = Nothing
where n' = natVal (Proxy :: Proxy n)
singleton :: forall a v. (VG.Vector v a)
=> a -> Vector v 1 a
singleton a = Vector (VG.singleton a)
generate :: forall (n :: Nat) a v. (VG.Vector v a, KnownNat n)
=> Proxy n -> (Int -> a) -> Vector v n a
generate n f = Vector (VG.generate (fromIntegral $ natVal n) f)
generateM :: forall (n :: Nat) a v m. (VG.Vector v a, KnownNat n, Monad m)
=> Proxy n -> (Int -> m a) -> m (Vector v n a)
generateM n f = Vector <$> VG.generateM (fromIntegral $ natVal n) f
withVectorUnsafe :: forall a b v (n :: Nat). (VG.Vector v a, VG.Vector v b)
=> (v a -> v b) -> Vector v n a -> Vector v n b
withVectorUnsafe f (Vector v) = Vector (f v)
index :: forall (m :: Nat) a v (n :: Nat). (KnownNat n, KnownNat m, VG.Vector v a)
=> Vector v (m+n) a -> Proxy n -> a
index (Vector v) i = v `VG.unsafeIndex` fromIntegral (natVal i)
take :: forall (m :: Nat) a v (n :: Nat). (KnownNat n, KnownNat m, VG.Vector v a)
=> Proxy n -> Vector v (m+n) a -> Vector v n a
take i (Vector v) = Vector (VG.take (fromIntegral $ natVal i) v)
drop :: forall (m :: Nat) a v (n :: Nat). (KnownNat n, KnownNat m, VG.Vector v a)
=> Proxy n -> Vector v (m+n) a -> Vector v m a
drop i (Vector v) = Vector (VG.drop (fromIntegral $ natVal i) v)
length :: forall a v (n :: Nat). (VG.Vector v a)
=> Vector v n a -> Int
length (Vector v) = VG.length v
head :: forall a v (n :: Nat). (VG.Vector v a)
=> Vector v (n+1) a -> a
head (Vector v) = VG.head v
last :: forall a v (n :: Nat). (VG.Vector v a)
=> Vector v (n+1) a -> a
last (Vector v) = VG.last v
tail :: forall a v (n :: Nat). (VG.Vector v a)
=> Vector v (n+1) a -> Vector v n a
tail (Vector v) = Vector (VG.tail v)
init :: forall a v (n :: Nat). (VG.Vector v a)
=> Vector v (n+1) a -> Vector v n a
init (Vector v) = Vector (VG.init v)
replicate :: forall a v (n :: Nat). (VG.Vector v a, KnownNat n)
=> a -> Vector v n a
replicate a = Vector (VG.replicate (fromIntegral $ natVal (Proxy :: Proxy n)) a)
map :: forall a b v (n :: Nat). (VG.Vector v a, VG.Vector v b)
=> (a -> b) -> Vector v n a -> Vector v n b
map f = withVectorUnsafe (VG.map f)
imapM_ :: forall a v n b m. (VG.Vector v a, Monad m)
=> (Int -> a -> m b) -> Vector v n a -> m ()
imapM_ f (Vector v) = VG.imapM_ f v
foldl' :: forall a b v (n :: Nat). VG.Vector v b
=> (a -> b -> a) -> a -> Vector v n b -> a
foldl' f z (Vector v) = VG.foldl' f z v
foldl1' :: forall a v (n :: Nat). (VG.Vector v a)
=> (a -> a -> a) -> Vector v (n+1) a -> a
foldl1' f (Vector v) = VG.foldl1' f v