RACTupleSequence.m 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //
  2. // RACTupleSequence.m
  3. // ReactiveObjC
  4. //
  5. // Created by Justin Spahr-Summers on 2013-05-01.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "RACTupleSequence.h"
  9. #import "RACTuple.h"
  10. @interface RACTupleSequence ()
  11. // The array being sequenced, as taken from RACTuple.backingArray.
  12. @property (nonatomic, strong, readonly) NSArray *tupleBackingArray;
  13. // The index in the array from which the sequence starts.
  14. @property (nonatomic, assign, readonly) NSUInteger offset;
  15. @end
  16. @implementation RACTupleSequence
  17. #pragma mark Lifecycle
  18. + (RACSequence *)sequenceWithTupleBackingArray:(NSArray *)backingArray offset:(NSUInteger)offset {
  19. NSCParameterAssert(offset <= backingArray.count);
  20. if (offset == backingArray.count) return self.empty;
  21. RACTupleSequence *seq = [[self alloc] init];
  22. seq->_tupleBackingArray = backingArray;
  23. seq->_offset = offset;
  24. return seq;
  25. }
  26. #pragma mark RACSequence
  27. - (id)head {
  28. id object = self.tupleBackingArray[self.offset];
  29. return (object == RACTupleNil.tupleNil ? NSNull.null : object);
  30. }
  31. - (RACSequence *)tail {
  32. RACSequence *sequence = [self.class sequenceWithTupleBackingArray:self.tupleBackingArray offset:self.offset + 1];
  33. sequence.name = self.name;
  34. return sequence;
  35. }
  36. - (NSArray *)array {
  37. NSRange range = NSMakeRange(self.offset, self.tupleBackingArray.count - self.offset);
  38. NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:range.length];
  39. [self.tupleBackingArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range] options:0 usingBlock:^(id object, NSUInteger index, BOOL *stop) {
  40. id mappedObject = (object == RACTupleNil.tupleNil ? NSNull.null : object);
  41. [array addObject:mappedObject];
  42. }];
  43. return array;
  44. }
  45. #pragma mark NSObject
  46. - (NSString *)description {
  47. return [NSString stringWithFormat:@"<%@: %p>{ name = %@, tuple = %@ }", self.class, self, self.name, self.tupleBackingArray];
  48. }
  49. @end