RACStringSequence.m 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //
  2. // RACStringSequence.m
  3. // ReactiveObjC
  4. //
  5. // Created by Justin Spahr-Summers on 2012-10-29.
  6. // Copyright (c) 2012 GitHub. All rights reserved.
  7. //
  8. #import "RACStringSequence.h"
  9. @interface RACStringSequence ()
  10. // The string being sequenced.
  11. @property (nonatomic, copy, readonly) NSString *string;
  12. // The index in the string from which the sequence starts.
  13. @property (nonatomic, assign, readonly) NSUInteger offset;
  14. @end
  15. @implementation RACStringSequence
  16. #pragma mark Lifecycle
  17. + (RACSequence *)sequenceWithString:(NSString *)string offset:(NSUInteger)offset {
  18. NSCParameterAssert(offset <= string.length);
  19. if (offset == string.length) return self.empty;
  20. RACStringSequence *seq = [[self alloc] init];
  21. seq->_string = [string copy];
  22. seq->_offset = offset;
  23. return seq;
  24. }
  25. #pragma mark RACSequence
  26. - (id)head {
  27. return [self.string substringWithRange:NSMakeRange(self.offset, 1)];
  28. }
  29. - (RACSequence *)tail {
  30. RACSequence *sequence = [self.class sequenceWithString:self.string offset:self.offset + 1];
  31. sequence.name = self.name;
  32. return sequence;
  33. }
  34. - (NSArray *)array {
  35. NSUInteger substringLength = self.string.length - self.offset;
  36. NSMutableArray *array = [NSMutableArray arrayWithCapacity:substringLength];
  37. [self.string enumerateSubstringsInRange:NSMakeRange(self.offset, substringLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
  38. [array addObject:substring];
  39. }];
  40. return [array copy];
  41. }
  42. #pragma mark NSObject
  43. - (NSString *)description {
  44. return [NSString stringWithFormat:@"<%@: %p>{ name = %@, string = %@ }", self.class, self, self.name, [self.string substringFromIndex:self.offset]];
  45. }
  46. @end