summaryrefslogtreecommitdiff
path: root/progs/prelude/PreludeArrayPrims.hi
blob: a8529c067947d68c266e0a977a8477e49029ee7a (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- 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")
#-}