Require Import Coq.Numbers.DecimalString ExtrOcamlBasic ExtrOcamlString. From stdpp Require Import strings stringmap gmap. From mininix Require Import nix.interp. Definition attr_set_insert (x : string) (α : attr) (αs : gmap string attr) : gmap string attr := <[x:=α]> αs. Definition attr_set_contains (x : string) (αs : gmap string attr) : bool := bool_decide (x ∈ dom αs). Definition attr_set_fold {A} (f : string → attr → A → A) (init : A) (αs : gmap string attr) : A := map_fold f init αs. Definition attr_set_empty : gmap string attr := ∅. Definition env_fold {A} (f : string → (kind * thunk) → A → A) (init : A) (E : env) : A := map_fold f init E. Definition env_insert_abs (x : string) (t : thunk) (E : env) : env := <[x:=(ABS,t)]> E. Definition thunk_map_fold {A} (f : string → thunk → A → A) (init : A) (bs : gmap string thunk) : A := map_fold f init bs. Definition thunk_map_insert (x : string) (t : thunk) (bs : gmap string thunk) : gmap string thunk := <[x:=t]> bs. Definition thunk_map_empty : gmap string thunk := ∅. Definition matcher := gmap string (option expr). Definition matcher_empty : matcher := ∅. Definition matcher_insert (x : string) (me : option expr) (ms : matcher) : matcher := <[x:=me]> ms. Definition matcher_fold {A} (f : string → option expr → A → A) (init : A) (ms : matcher) : A := map_fold f init ms. Definition env_empty : env := ∅. Definition string_of_Z (x : Z) : string := NilZero.string_of_int (Z.to_int x). Definition string_to_Z (s : string) : option Z := Z.of_int <$> NilZero.int_of_string s. Separate Extraction attr_set_insert env_insert_abs matcher_insert thunk_map_insert attr_set_contains attr_set_fold env_fold matcher_fold thunk_map_fold env_empty attr_set_empty matcher_empty thunk_map_empty string_of_Z string_to_Z interp' forallb.