let rec map_types f gen v = match v.value with
| Unit | Bool _ | Int _ | String _ | Float _ | Encoder _ ->
{ v with t = f gen v.t }
| Product (a,b) ->
{ t = f gen v.t ;
value = Product (map_types f gen a, map_types f gen b) }
| List l ->
{ t = f gen v.t ;
value = List (List.map (map_types f gen) l) }
| Fun (p,applied,env,tm) ->
let aux = function
| lbl, var, None -> lbl, var, None
| lbl, var, Some v -> lbl, var, Some (map_types f gen v)
in
{ t = f gen v.t ;
value =
Fun (List.map aux p,
map_env (map_types f gen) applied,
map_env (map_types f gen) env,
tm_map_types f gen tm) }
| FFI (p,applied,ffi) ->
let aux = function
| lbl, var, None -> lbl, var, None
| lbl, var, Some v -> lbl, var, Some (map_types f gen v)
in
{ t = f gen v.t ;
value = FFI (List.map aux p,
map_env (map_types f gen) applied,
ffi) }
| Source s ->
assert (f gen v.t = v.t) ;
v
| Request s ->
assert (f gen v.t = v.t) ;
v
| Ref r ->
assert (f gen v.t = v.t) ;
r := map_types f gen !r ;
v