using Invercargill; namespace InvercargillJson { public interface JsonElements : Enumerable, Elements { public virtual Enumerable as_arrays() { return select(n => new JsonArray.from_existing(n.assert_as().get_array())); } public virtual Enumerable as_bools() { return select(n => n.assert_as().get_boolean()); } public virtual Doubles as_doubles() { return select(n => n.assert_as().get_double()).promote_to(); } public virtual Signed64BitIntegers as_integers() { return select(n => n.assert_as().get_int()).promote_to(); } public virtual Enumerable as_strings() { return select(n => n.assert_as().get_string()); } public virtual Enumerable as_objects() { return select(n => new JsonObject.from_existing(n.assert_as().get_object())); } public virtual JsonArray to_json_array() { var array = new JsonArray(); array.add_all((Enumerable)this); return array; } } private class JsonElementsPromotionImplementation : Object, Promotion { public bool can_wrap(GLib.Type element_type) { return element_type.is_a(typeof(JsonElement)); } public Enumerable wrap(Enumerable enumerable) { return new JsonElementsProxy(enumerable.cast()); } } private class JsonElementsProxy : ProxyEnumerable, Elements, JsonElements { public JsonElementsProxy(Enumerable elements) { inner = elements; } } }