Import Upstream version 20180207
[hcoop/debian/mlton.git] / basis-library / primitive / prim-seq.sml
1 (* Copyright (C) 2017 Matthew Fluet.
2 * Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
5 *
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
8 *)
9
10 (* Primitive names are special -- see atoms/prim.fun. *)
11
12 structure Primitive = struct
13
14 open Primitive
15
16 structure Array =
17 struct
18 open Array
19 val allocUnsafe = _prim "Array_alloc": SeqIndex.int -> 'a array;
20 val copyArrayUnsafe = _prim "Array_copyArray": 'a array * SeqIndex.int * 'a array * SeqIndex.int * SeqIndex.int -> unit;
21 val copyVectorUnsafe = _prim "Array_copyVector": 'a array * SeqIndex.int * 'a vector * SeqIndex.int * SeqIndex.int -> unit;
22 val length = _prim "Array_length": 'a array -> SeqIndex.int;
23 (* There is no maximum length on arrays, so maxLen' = SeqIndex.maxInt'. *)
24 (* val maxLen': SeqIndex.int = SeqIndex.maxInt' *)
25 val subUnsafe = _prim "Array_sub": 'a array * SeqIndex.int -> 'a;
26 val uninitIsNop = _prim "Array_uninitIsNop": 'a array -> bool;
27 val uninitUnsafe = _prim "Array_uninit": 'a array * SeqIndex.int -> unit;
28 val updateUnsafe = _prim "Array_update": 'a array * SeqIndex.int * 'a -> unit;
29
30 structure Raw :> sig
31 type 'a rawarr
32 val allocUnsafe: SeqIndex.int -> 'a rawarr
33 val length: 'a rawarr -> SeqIndex.int
34 val toArrayUnsafe: 'a rawarr -> 'a array
35 val uninitIsNop: 'a rawarr -> bool
36 val uninitUnsafe: 'a rawarr * SeqIndex.int -> unit
37 end =
38 struct
39 type 'a rawarr = 'a array
40 val allocUnsafe = _prim "Array_allocRaw": SeqIndex.int -> 'a rawarr;
41 val length = length
42 val toArrayUnsafe = _prim "Array_toArray": 'a rawarr -> 'a array;
43 val uninitIsNop = uninitIsNop
44 val uninitUnsafe = uninitUnsafe
45 end
46 end
47
48 structure Vector =
49 struct
50 open Vector
51 (* Don't mutate the array after you apply fromArray, because vectors
52 * are supposed to be immutable and the optimizer depends on this.
53 *)
54 val fromArrayUnsafe = _prim "Array_toVector": 'a array -> 'a vector;
55 val length = _prim "Vector_length": 'a vector -> SeqIndex.int;
56 val subUnsafe = _prim "Vector_sub": 'a vector * SeqIndex.int -> 'a;
57 val vector0 = _prim "Vector_vector": unit -> 'a vector;
58 end
59
60 end