using Invercargill; namespace InvercargillJson { public class JsonArray : Enumerable, Lot, ReadOnlyCollection, ReadOnlyAddressable, Collection, Addressable, Sticky, Elements, JsonElements{ private Json.Array array; internal Json.Array json_glib_object { get { return array; } } public JsonArray() { array = new Json.Array(); } internal JsonArray.from_existing(Json.Array array) { this.array = array; } public override Tracker get_tracker() { var i = 0; return new LambdaTracker( () => { return i < array.get_length(); }, () => { return new JsonElement.from_node(array.get_element(i++)); }); } public new JsonElement @get(uint index) { return new JsonElement.from_node(array.get_element(index)); } public uint? first_index_of(PredicateDelegate predicate) { return with_positions().first_or_default(i => predicate(i.item))?.position ?? -1; } public void remove_at(int index) { array.remove_element(index); } public new void @set(uint index, JsonElement item) { assert_not_reached(); } public void add(JsonElement item) { array.add_element(item.assert_as()); } public void remove_first_where(Invercargill.PredicateDelegate predicate) { var index = first_index_of(predicate); if(index >= 0) { array.remove_element(index); } } public void remove_all_where(Invercargill.PredicateDelegate predicate) { with_positions() .where(i => predicate((JsonElement)i.item)) .iterate(i => array.remove_element(i.position)); } public void clear() { remove_all_where(i => true); } public bool try_get(uint index, out JsonElement value) { value = get(index); return true; } protected JsonElements adhere(Invercargill.Enumerable enumerable) { return enumerable.assert_promotion(); } public uint length { get { return array.get_length(); } } public override Invercargill.EnumerableInfo get_info() { return new Invercargill.EnumerableInfo.infer_ultimate(this, Invercargill.EnumerableCategory.IN_MEMORY); } public override uint? peek_count() { return array.get_length(); } } }