easytensor-1.0.0.0: src/Numeric/DataFrame/Internal/Array/Class.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UnboxedTuples #-}
module Numeric.DataFrame.Internal.Array.Class
( PrimArray (..)
, ixOff, unsafeFromFlatList
) where
import GHC.Base (ByteArray#, Int#, Int (..))
import Numeric.PrimBytes
class PrimBytes t => PrimArray t a | a -> t where
-- | Broadcast element into array
broadcast :: t -> a
-- | Index an array given an offset
ix# :: Int# -> a -> t
-- | Generate an array using an accumulator funtion
gen# :: Int# -- ^ number of elements, not checked!
-- Avoid using this argument if possible.
-> (s -> (# s, t #))
-> s -> (# s, a #)
-- | update a single element in an array given an offset
upd# :: Int# -- ^ number of elements, not checked!
-- Avoid using this argument if possible.
-> Int# -> t -> a -> a
-- | Offset of an array in number of elements
elemOffset :: a -> Int#
-- | Number of elements in an array.
-- Returns zero if this information is not available at runtime.
-- This is possible only if all elements are same in an array.
elemSize0 :: a -> Int#
-- | Get array by its offset and size in a ByteArray.
-- Both offset and size are given in element number.
fromElems :: Int# -> Int# -> ByteArray# -> a
-- | Index array by an integer offset (starting from 0).
ixOff :: PrimArray t a => Int -> a -> t
ixOff (I# i) = ix# i
-- | Construct an array from a flat list and length
unsafeFromFlatList :: PrimArray t a => Int -> [t] -> a
unsafeFromFlatList (I# n) vs = case gen# n f vs of (# _, r #) -> r
where
f [] = (# [], undefined #)
f (x:xs) = (# xs, x #)