staload "symintr.sats"
staload "maybe.sats"

abstype map (k:t@ype, v:t@ype) = ptr 

typedef nat = intGte 0

fun {k,v:t@ype} map_make (): map (k, v) 

fun {k,v:t@ype} map_insert (map (k, v), k, v): map (k, v)
fun {k,v:t@ype} map_delete (map (k, v), k): map (k, v)  
fun {k,v:t@ype} map_update (map (k, v), k, v): map (k, v)
fun {k,v:t@ype} map_get    (map (k, v), k): v
fun {k,v:t@ype} map_find   (map (k, v), k): maybe v

fun {k,v:t@ype} map_empty (map (k, v)): bool
fun {k,v:t@ype} map_size (map (k, v)): nat

fun {k,v:t@ype} map_foreach (map (k, v), k -<cloref1> void): void 
fun {k,v:t@ype} map_filter (map (k, v), k -<cloref1> bool): map (k, v)

fun {k,v:t@ype} map_member (map (k, v), k): bool 
fun {k,v:t@ype} map_any (map (k, v), k -<cloref1> bool): bool 
fun {k,v:t@ype} map_all (map (k, v), k -<cloref1> bool): bool


overload []      with map_get 

overload make    with map_make 
overload insert  with map_insert 
overload delete  with map_delete 
overload update  with map_update 
overload find    with map_find 

overload empty   with map_empty 
overload size    with map_size 

overload foreach with map_foreach 
overload filter  with map_filter 

overload member  with map_member 
overload any     with map_any 
overload all     with map_all