Source file list_internal.ml
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
open Catala_runtime
let sequence : integer -> integer -> integer array =
fun start stop ->
let len = Z.sub stop start in
if Z.sign len <> 1 then [||]
else Array.init (Z.to_int len) (fun i -> Z.add start (Z.of_int i))
let nth_element : 't array -> integer -> 't Optional.t =
fun arr n ->
let n = Z.to_int n - 1 in
if 0 <= n && n < Array.length arr then Optional.Present arr.(n)
else Optional.Absent ()
let remove_nth_element : 't array -> integer -> 't array =
fun arr n ->
let n = Z.to_int n - 1 in
let len = Array.length arr in
if n < 0 || len <= n then arr
else
let ret = Array.make (Array.length arr - 1) arr.(0) in
if n > 0 then Array.blit arr 0 ret 0 n;
if n < len - 1 then Array.blit arr (n + 1) ret n (len - n - 1);
ret
let () =
Catala_runtime.register_module "List_internal"
[
"sequence", Obj.repr sequence;
"nth_element", Obj.repr nth_element;
"remove_nth_element", Obj.repr remove_nth_element;
]
"*external*"