include "modelling.alh" include "primitives.alh" include "object_operations.alh" include "model_management.alh" String function JSON_print(model : Element): String result Element keys_m String v_m String type String attr_key Element attr_keys Boolean first Element attr_value result = "[" keys_m = dict_keys(model["model"]) first = True while (read_nr_out(keys_m) > 0): v_m = set_pop(keys_m) type = read_type(model["metamodel"], read_type(model, v_m)) if (bool_or(type == "Class", type == "Association")): if (bool_not(first)): result = result + "," else: first = False result = result + "{" result = (((result + "\"id\": \"") + v_m) + "\"") result = (((result + ",") + "\"type\": \"") + read_type(model, v_m)) + "\"" if (type == "Association"): result = (((result + ", \"__source\": \"") + reverseKeyLookup(model["model"], read_edge_src(model["model"][v_m]))) + "\"") result = (((result + ", \"__target\": \"") + reverseKeyLookup(model["model"], read_edge_dst(model["model"][v_m]))) + "\"") // Has attributes attr_keys = dict_keys(getAttributeList(model, v_m)) while (0 < read_nr_out(attr_keys)): attr_key = set_pop(attr_keys) attr_value = read_attribute(model, v_m, attr_key) if (element_eq(attr_value, read_root())): result = (((result + ", \"") + attr_key) + "\": null") else: if (is_physical_boolean(attr_value)): if (attr_value): result = ((result + ", \"") + attr_key) + "\": true" else: result = ((result + ", \"") + attr_key) + "\": false" else: result = ((((result + ", \"") + attr_key) + "\": ") + cast_v2s(attr_value)) result = result + "}" result = result + "]" return result! Element function input_timeout(timeout : Float): Float start start = time() // Do this first, such that we will always get at least the chance to push input in if (has_input()): return input()! // Now just try this again from time to time while (time() - start < timeout): if (has_input()): return input()! else: // Nothing to do, we should yield... sleep(0.02) return read_root()! Element function list_reverse(lst : Element): Element result result = create_node() Integer i i = list_len(lst) while (i > 0): list_append(result, list_read(lst, i)) i = i - 1 return result! Element function list_splice(lst : Element, start : Integer, end : Integer): Element result result = create_node() Integer i i = start while (i < end): list_append(result, list_read(lst, i)) i = i + 1 return result! Void function list_extend(lst : Element, ext : Element): Integer i i = 0 while (i < list_len(ext)): list_append(lst, list_read(ext, i)) i = i + 1 return! Void function set_difference(set1 : Element, set2 : Element): set2 = set_copy(set2) while (read_nr_out(set2) > 0): set_remove(set1, set_pop(set2)) return! String function get_taskname(): log("Taskname is: " + reverseKeyLookup(read_root(), read_taskroot())) return reverseKeyLookup(read_root(), read_taskroot())!