{-# LANGUAGE TypeFamilies #-}
module Data.Array.Comfort.Boxed.Internal where
import qualified Data.Array.Comfort.Shape as Shape
import qualified Data.Primitive.Array as Prim
import qualified Control.Monad.ST.Strict as STStrict
import Prelude hiding (map, )
data Array sh a =
Array {
shape :: sh,
buffer :: Prim.Array a
}
reshape :: sh1 -> Array sh0 a -> Array sh1 a
reshape sh (Array _ arr) = Array sh arr
mapShape :: (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
mapShape f (Array sh arr) = Array (f sh) arr
infixl 9 !
(!) :: (Shape.Indexed sh) => Array sh a -> Shape.Index sh -> a
(!) (Array sh arr) ix = Prim.indexArray arr $ Shape.offset sh ix
toList :: (Shape.C sh) => Array sh a -> [a]
toList (Array sh arr) =
STStrict.runST (mapM (Prim.indexArrayM arr) $ take (Shape.size sh) [0..])
fromList :: (Shape.C sh) => sh -> [a] -> Array sh a
fromList sh xs = Array sh $ Prim.fromListN (Shape.size sh) xs
vectorFromList :: [a] -> Array (Shape.ZeroBased Int) a
vectorFromList xs =
let arr = Prim.fromList xs
in Array (Shape.ZeroBased $ Prim.sizeofArray arr) arr
map :: (Shape.C sh) => (a -> b) -> Array sh a -> Array sh b
map f (Array sh arr) = Array sh $ Prim.mapArray' f arr