ligo/mini_c/environment.ml
2019-05-12 20:57:30 +00:00

62 lines
1.8 KiB
OCaml

(* open Trace *)
open Types
(* module type ENVIRONMENT = sig
* type element = environment_element
* type t = environment
*
* val empty : t
* val add : element -> t -> t
* val concat : t list -> t
* val get_opt : string -> t -> type_value option
* val get_i : string -> t -> (type_value * int)
* val of_list : element list -> t
* val closure_representation : t -> type_value
* end *)
module Environment (* : ENVIRONMENT *) = struct
type element = environment_element
type t = environment
let empty : t = []
let add : element -> t -> t = List.cons
let concat : t list -> t = List.concat
let get_opt : string -> t -> type_value option = List.assoc_opt
let has : string -> t -> bool = fun s t ->
match get_opt s t with
| None -> false
| Some _ -> true
let get_i : string -> t -> (type_value * int) = List.assoc_i
let of_list : element list -> t = fun x -> x
let to_list : t -> element list = fun x -> x
let get_names : t -> string list = List.map fst
let remove : int -> t -> t = List.remove
let select : string list -> t -> t = fun lst env ->
let e_lst =
let e_lst = to_list env in
let aux selector (s , _) =
match List.mem s selector with
| true -> List.remove_element s selector , true
| false -> selector , false in
let e_lst' = List.fold_map_right aux lst e_lst in
let e_lst'' = List.combine e_lst e_lst' in
e_lst'' in
of_list
@@ List.map fst
@@ List.filter snd
@@ e_lst
let fold : _ -> 'a -> t -> 'a = List.fold_left
let filter : _ -> t -> t = List.filter
let closure_representation : t -> type_value = fun t ->
match t with
| [] -> T_base Base_unit
| [ a ] -> snd a
| hd :: tl -> List.fold_left (fun acc cur -> T_pair (acc , snd cur)) (snd hd) tl
end
include Environment