aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/third_party/Immutable/FSTArraySortedDictionaryEnumerator.m
diff options
context:
space:
mode:
Diffstat (limited to 'Firestore/third_party/Immutable/FSTArraySortedDictionaryEnumerator.m')
-rw-r--r--Firestore/third_party/Immutable/FSTArraySortedDictionaryEnumerator.m54
1 files changed, 54 insertions, 0 deletions
diff --git a/Firestore/third_party/Immutable/FSTArraySortedDictionaryEnumerator.m b/Firestore/third_party/Immutable/FSTArraySortedDictionaryEnumerator.m
new file mode 100644
index 0000000..e8fdfcc
--- /dev/null
+++ b/Firestore/third_party/Immutable/FSTArraySortedDictionaryEnumerator.m
@@ -0,0 +1,54 @@
+#import "FSTArraySortedDictionaryEnumerator.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+// clang-format off
+// For some reason, clang-format messes this line up...
+@interface FSTArraySortedDictionaryEnumerator<KeyType, ValueType> ()
+@property(nonatomic, assign) int pos;
+@property(nonatomic, assign) int start;
+@property(nonatomic, assign) int end;
+@property(nonatomic, assign) BOOL reverse;
+@property(nonatomic, strong) NSArray<KeyType> *keys;
+@end
+// clang-format on
+
+@implementation FSTArraySortedDictionaryEnumerator
+
+- (id)initWithKeys:(NSArray *)keys startPos:(int)start endPos:(int)end isReverse:(BOOL)reverse {
+ self = [super init];
+ if (self != nil) {
+ _keys = keys;
+ _start = start;
+ _end = end;
+ _pos = start;
+ _reverse = reverse;
+ }
+ return self;
+}
+
+- (nullable id)nextObject {
+ if (self.pos < 0 || self.pos >= self.keys.count) {
+ return nil;
+ }
+ if (self.reverse) {
+ if (self.pos <= self.end) {
+ return nil;
+ }
+ } else {
+ if (self.pos >= self.end) {
+ return nil;
+ }
+ }
+ int pos = self.pos;
+ if (self.reverse) {
+ self.pos--;
+ } else {
+ self.pos++;
+ }
+ return self.keys[pos];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END