Generate immutable setters with type-changing singleton updates

This commit is contained in:
milner committed 2019-03-10 12:38:49 +00:00
1 parent 4eda2052af
commit 40dc020f24
2 files changed
+25 -2

No files matched your search

+8 -2
View File
@@ -27,11 +27,17 @@ let generate declaration =
let source_pattern = Pat.constraint_ ~loc (variable ~loc "__fg_source")
(Typ.constr ~loc (ident ~loc declaration.ptype_name.txt)
(List.map (fun _ -> Typ.any ~loc ()) declaration.ptype_params)) in
List.map (fun field ->
List.concat (List.map (fun field ->
let name = field.pld_name.txt in
let getter = lambda ~loc Nolabel source_pattern
(Exp.field ~loc source (ident ~loc name)) in
Str.value ~loc Nonrecursive [Vb.mk ~loc (variable ~loc name) getter]) fields
let replacement = Exp.record ~loc [ident ~loc name, value ~loc "__fg_value"]
(if List.length fields = 1 then None else Some source) in
let setter = lambda ~loc Nolabel (variable ~loc "__fg_value")
(lambda ~loc Nolabel source_pattern replacement) in
List.map (fun (name, body) ->
Str.value ~loc Nonrecursive [Vb.mk ~loc (variable ~loc name) body])
[name, getter; "set_" ^ name, setter]) fields)
let structure mapper items =
List.concat (List.map (fun item ->