diff --git a/object.c b/object.c index 93d3636..0d9cb60 100644 --- a/object.c +++ b/object.c @@ -238,6 +238,7 @@ oop makeMap() size_t map_size(oop map) { + assert(is(Map, map)); return get(map, Map, size); } @@ -295,9 +296,8 @@ ssize_t map_search(oop map, oop key) bool map_hasKey(oop map, oop key) { - // checks already done by map_search - //assert(is(Map, map)); - //assert(key); + assert(is(Map, map)); + assert(key); return map_search(map, key) >= 0; } @@ -373,6 +373,43 @@ oop map_append(oop map, oop value) return map_set(map, makeInteger(map_size(map)), value); } +bool isHidden(oop obj) { + if (!is(Symbol, obj)) { + return false; + } + char *s = get(obj, Symbol, name); + size_t l = strlen(s); + // maybe 'l > 5' because of ____? + if (l > 4 && s[0] == '_' && s[1] == '_' && s[l-2] == '_' && s[l-1] == '_') { + return true; + } + return false; +} + +oop map_keys(oop map) +{ + assert(is(Map, map)); + oop keys = makeMap(); + for (size_t i = 0; i < get(map, Map, size); i++) { + if (!isHidden(get(map, Map, elements)[i].key)) { + map_append(keys, get(map, Map, elements)[i].key); + } + } + return keys; +} + +oop map_values(oop map) +{ + assert(is(Map, map)); + oop values = makeMap(); + for (size_t i = 0; i < get(map, Map, size); i++) { + if (!isHidden(get(map, Map, elements)[i].key)) { + map_append(values, get(map, Map, elements)[i].value); + } + } + return values; +} + void map_print(oop map, int ident) { assert(is(Map, map));