Array.vala 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. namespace Invercargill.Wrappers {
  2. public class Array<T> : Enumerable<T>, Lot<T>, ImmutableLot<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 int? peek_count() {
  11. return array.length;
  12. }
  13. public override EnumerableInfo get_info() {
  14. return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
  15. }
  16. public override uint length { get { return array.length; }}
  17. public override Tracker<T> get_tracker() {
  18. var i = 0;
  19. return new LambdaTracker<T>(
  20. () => {
  21. return i < array.length;
  22. },
  23. () => {
  24. var res = safely_read_array<T>(array, i);
  25. i++;
  26. return res;
  27. });
  28. }
  29. public new T get(uint index) throws IndexError {
  30. if(index >= array.length) {
  31. throw new IndexError.INDEX_EXCEEDS_UPPER_BOUNDS(@"Tried to access index $(index) on a wrapped array with $(array.length) item(s)");
  32. }
  33. return safely_read_array<T>(array, index);
  34. }
  35. public bool try_get(uint index, out T value) {
  36. if(index >= array.length) {
  37. value = null;
  38. return false;
  39. }
  40. value = safely_read_array<T>(array, index);
  41. return true;
  42. }
  43. public uint? first_index_of(Invercargill.PredicateDelegate<T> predicate) {
  44. for(uint i = 0; i < array.length; i++) {
  45. var item = safely_read_array<T>(array, i);
  46. if(predicate(item)) {
  47. return i;
  48. }
  49. }
  50. return null;
  51. }
  52. }
  53. }