staload "fgnode.sats"
assume fgnode_t = Nat
implement fgnode_make_int (n) = n
implement fprint_fgnode (out, fgn) = fprint_int (out, fgn)
implement print_fgnode (fgn) = fprint_fgnode (stdout_ref, fgn)
implement prerr_fgnode (fgn) = fprint_fgnode (stderr_ref, fgn)
implement eq_fgnode_fgnode (fgn1, fgn2) = eq_int_int (fgn1, fgn2)
implement compare_fgnode_fgnode (fgn1, fgn2) = compare_int_int (fgn1, fgn2)
assume fgnodelst_t = List (fgnode_t)
implement fgnodelst_nil () = '[]
implement fgnodelst_sing (fgn) = '[fgn]
implement fprint_fgnodelst
(out, fgns) = loop (out, fgns, 0) where {
fun loop (out: FILEref, fgns: fgnodelst_t, i: int): void =
case+ fgns of
| list_cons (fgn, fgns) => () where {
val () = if i > 0 then fprint_string (out, ", ")
val () = fprint_fgnode (out, fgn)
val () = loop (out, fgns, i+1)
} | list_nil () => ()
}
implement print_fgnodelst (fgns) = fprint_fgnodelst (stdout_ref, fgns)
implement prerr_fgnodelst (fgns) = fprint_fgnodelst (stderr_ref, fgns)
implement fgnodelst_ismem (fgns, fgn0) = case+ fgns of
| list_cons (fgn, fgns) =>
if fgn0 < fgn then false
else if fgn0 > fgn then fgnodelst_ismem (fgns, fgn0)
else true
| list_nil () => false
implement fgnodelst_add (fgns, fgn0) = case+ fgns of
| list_cons (fgn, fgns1) => begin
if fgn0 < fgn then
list_cons (fgn0, fgns)
else if fgn0 > fgn then
list_cons (fgn, fgnodelst_add (fgns1, fgn0))
else fgns
end | list_nil () => list_cons (fgn0, list_nil)