Array.vala 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Invercargill;
  2. namespace InvercargillJson {
  3. public class JsonArray : Enumerable<JsonElement>, Lot<JsonElement>, ReadOnlyCollection<JsonElement>, ReadOnlyAddressable<JsonElement>, Collection<JsonElement>, Addressable<JsonElement>, Sticky<JsonElements, JsonElement>, Elements, JsonElements{
  4. private Json.Array array;
  5. internal Json.Array json_glib_object { get { return array; } }
  6. public JsonArray() {
  7. array = new Json.Array();
  8. }
  9. internal JsonArray.from_existing(Json.Array array) {
  10. this.array = array;
  11. }
  12. public override Tracker<JsonElement> get_tracker() {
  13. var i = 0;
  14. return new LambdaTracker<JsonElement>(
  15. () => {
  16. return i < array.get_length();
  17. },
  18. () => {
  19. return new JsonElement.from_node(array.get_element(i++));
  20. });
  21. }
  22. public new JsonElement @get(uint index) {
  23. return new JsonElement.from_node(array.get_element(index));
  24. }
  25. public uint? first_index_of(PredicateDelegate<Element> predicate) {
  26. return with_positions().first_or_default(i => predicate(i.item))?.position ?? -1;
  27. }
  28. public void remove_at(int index) {
  29. array.remove_element(index);
  30. }
  31. public new void @set(uint index, JsonElement item) {
  32. assert_not_reached();
  33. }
  34. public void add(JsonElement item) {
  35. array.add_element(item.assert_as<Json.Node>());
  36. }
  37. public void remove_first_where(Invercargill.PredicateDelegate<JsonElement> predicate) {
  38. var index = first_index_of(predicate);
  39. if(index >= 0) {
  40. array.remove_element(index);
  41. }
  42. }
  43. public void remove_all_where(Invercargill.PredicateDelegate<JsonElement> predicate) {
  44. with_positions()
  45. .where(i => predicate((JsonElement)i.item))
  46. .iterate(i => array.remove_element(i.position));
  47. }
  48. public void clear() {
  49. remove_all_where(i => true);
  50. }
  51. public bool try_get(uint index, out JsonElement value) {
  52. value = get(index);
  53. return true;
  54. }
  55. protected JsonElements adhere(Invercargill.Enumerable<JsonElement> enumerable) {
  56. return enumerable.assert_promotion<JsonElements>();
  57. }
  58. public uint length { get { return array.get_length(); } }
  59. public override Invercargill.EnumerableInfo get_info() {
  60. return new Invercargill.EnumerableInfo.infer_ultimate(this, Invercargill.EnumerableCategory.IN_MEMORY);
  61. }
  62. public override uint? peek_count() {
  63. return array.get_length();
  64. }
  65. }
  66. }