blob: dd10f3c38b483253deb7f0a1ff7a70851e0b004c [file] [log] [blame] [edit]
//
// RACStringSequence.m
// ReactiveCocoa
//
// Created by Justin Spahr-Summers on 2012-10-29.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "RACStringSequence.h"
@interface RACStringSequence ()
// The string being sequenced.
@property (nonatomic, copy, readonly) NSString *string;
// The index in the string from which the sequence starts.
@property (nonatomic, assign, readonly) NSUInteger offset;
@end
@implementation RACStringSequence
#pragma mark Lifecycle
+ (RACSequence *)sequenceWithString:(NSString *)string offset:(NSUInteger)offset {
NSCParameterAssert(offset <= string.length);
if (offset == string.length) return self.empty;
RACStringSequence *seq = [[self alloc] init];
seq->_string = [string copy];
seq->_offset = offset;
return seq;
}
#pragma mark RACSequence
- (id)head {
return [self.string substringWithRange:NSMakeRange(self.offset, 1)];
}
- (RACSequence *)tail {
RACSequence *sequence = [self.class sequenceWithString:self.string offset:self.offset + 1];
sequence.name = self.name;
return sequence;
}
- (NSArray *)array {
NSUInteger substringLength = self.string.length - self.offset;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:substringLength];
[self.string enumerateSubstringsInRange:NSMakeRange(self.offset, substringLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
[array addObject:substring];
}];
return [array copy];
}
#pragma mark NSObject
- (NSString *)description {
return [NSString stringWithFormat:@"<%@: %p>{ name = %@, string = %@ }", self.class, self, self.name, [self.string substringFromIndex:self.offset]];
}
@end