git.fiddlerwoaroof.com
Raw Blame History
-- These primitives are used to implement arrays with constant time
-- access.  There are destructive update routines for arrays for use
-- internally in functions such as array.  These are impure but are
-- marked as pure to keep them out of the top level monad.  This should
-- be redone using lambda-var someday.

interface PreludeBltinArray where


data Vector a    -- Used to represent vectors with delayed components
data Delay a     -- An explicit represenation of a delayed object


-- Primitive vectors now always have strict components.  This permits us
-- to treat array indexing as an atomic operation without the explicit
-- force on access.

primVectorSel :: Vector a -> Int -> a
primVectorUpdate :: Vector a -> Int -> a -> a
primMakeVector :: Int -> a -> Vector a
primCopyVector :: Vector a -> Vector a

-- These functions are used for explicit sequencing of destructive ops

strict1 :: a -> b -> b
primForce :: Delay a -> a

{-#
primVectorSel ::  LispName("prim.vector-sel"), Complexity(1)
primVectorUpdate :: LispName("prim.vector-update"), Complexity(1)
primMakeVector :: LispName("prim.make-vector"), Complexity(4)
primCopyVector :: LispName("prim.copy-vector"), Complexity(5)
strict1 :: Strictness("S,N"),
	   LispName("prim.strict1")
primForce :: LispName("prim.force")
#-}