Array.vala 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. namespace Invercargill.Wrappers {
  2. public class Array<T> : Enumerable<T>, Lot<T>, ReadOnlyAddressable<T> {
  3. private T[] array;
  4. public Array(T[] input) {
  5. array = new T[input.length];
  6. for(uint i = 0; i < array.length; i++) {
  7. safely_assign_to_array<T>(array, i, safely_read_array<T>(input, i));
  8. }
  9. }
  10. public override Tracker<T> get_tracker() {
  11. var i = 0;
  12. return new LambdaTracker<T>(
  13. () => {
  14. return i < array.length;
  15. },
  16. () => {
  17. var res = safely_read_array<T>(array, i);
  18. i++;
  19. return res;
  20. });
  21. }
  22. public new T get(uint index) throws IndexError {
  23. if(index >= array.length) {
  24. throw new IndexError.INDEX_EXCEEDS_UPPER_BOUNDS(@"Tried to access index $(index) on a wrapped array with $(array.length) item(s)");
  25. }
  26. return safely_read_array<T>(array, index);
  27. }
  28. public bool try_get(uint index, out T value) {
  29. if(index >= array.length) {
  30. value = null;
  31. return false;
  32. }
  33. value = safely_read_array<T>(array, index);
  34. return true;
  35. }
  36. public uint? first_index_of(Invercargill.PredicateDelegate<T> predicate) {
  37. for(uint i = 0; i < array.length; i++) {
  38. var item = safely_read_array<T>(array, i);
  39. if(predicate(item)) {
  40. return i;
  41. }
  42. }
  43. return null;
  44. }
  45. }
  46. }