Source file field.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
module For_generated_code = struct
type ('perm, 'record : any, 'field : any) t =
{ force_variance : 'perm -> unit
;
name : string
; setter : ('record -> 'field -> unit) option
; getter : 'record -> 'field
; fset : 'record -> 'field -> 'record
}
external opaque_identity
: ('a : any).
('a[@local_opt]) -> ('a[@local_opt])
@@ portable
= "%opaque"
[@@layout_poly]
end
type ('perm, 'record : any, 'field : any) t_with_perm =
| Field of ('perm, 'record, 'field) For_generated_code.t
[@@unboxed]
type ('record : any, 'field : any) t =
([ `Read | `Set_and_create ], 'record, 'field) t_with_perm
type ('record : any, 'field : any) readonly_t = ([ `Read ], 'record, 'field) t_with_perm
let name (Field field) = field.name
[%%template
[@@@kind.default
k
= ( base_or_null_with_imm
, value & value & value & bits32
, value & value & value & value & value
, value & value & value & value & value & value
, value & value & value & value & value & value & value
, float64 & float64 & float64 & float64 & float64 & float64
, (float64 & float64 & float64 & float64 & float64 & float64)
& (float64 & float64 & float64 & float64 & float64 & float64)
& (value & value & value & value & value & value)
& value
& value )]
let get (Field field) = field.getter
let fset (Field field) = field.fset
let setter (Field field) = field.setter
let map (Field field) r ~f = field.fset r (f (field.getter r))
let updater (Field field) =
match field.setter with
| None -> None
| Some setter -> Some (fun r ~f -> setter r (f (field.getter r)))
;;]
type ('perm, 'record : any, 'result) user =
{ f : 'field. ('perm, 'record, 'field) t_with_perm -> 'result }