-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathNNArrayDiff.m
More file actions
143 lines (110 loc) · 4.06 KB
/
Copy pathNNArrayDiff.m
File metadata and controls
143 lines (110 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//
// NNArrayDiff.m
// ArrayDiff
//
// Created by Nick Tymchenko on 02/04/14.
// Copyright (c) 2014 Nick Tymchenko. All rights reserved.
//
#import "NNArrayDiff.h"
#import "NNArrayDiffChange.h"
@implementation NNArrayDiff {
@protected
NSIndexSet *_deleted;
NSIndexSet *_inserted;
NSSet *_changed;
}
#pragma mark - Init
- (instancetype)init {
return [self initWithDeleted:nil inserted:nil changed:nil];
}
- (instancetype)initWithDeleted:(NSIndexSet *)deleted
inserted:(NSIndexSet *)inserted
changed:(NSSet *)changed
{
self = [super init];
if (!self) return nil;
_deleted = [deleted copy] ?: [NSIndexSet indexSet];
_inserted = [inserted copy] ?: [NSIndexSet indexSet];
_changed = [changed copy] ?: [NSSet set];
return self;
}
#pragma mark - NSCopying
- (id)copyWithZone:(NSZone *)zone {
return [[NNArrayDiff allocWithZone:zone] initWithDeleted:self.deleted inserted:self.inserted changed:self.changed];
}
#pragma mark - NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone {
return [[NNMutableArrayDiff allocWithZone:zone] initWithDeleted:self.deleted inserted:self.inserted changed:self.changed];
}
#pragma mark - NSObject
- (BOOL)isEqual:(id)other {
if (other == self) return YES;
if (!other || ![other isKindOfClass:[NNArrayDiff class]]) return NO;
return [self isEqualToArrayDiff:other];
}
- (BOOL)isEqualToArrayDiff:(NNArrayDiff *)other {
if (![self.deleted isEqualToIndexSet:other.deleted]) return NO;
if (![self.inserted isEqualToIndexSet:other.inserted]) return NO;
if (![self.changed isEqualToSet:other.changed]) return NO;
return YES;
}
- (NSUInteger)hash {
NSUInteger prime = 31;
NSUInteger result = 1;
result = prime * result + [self.deleted hash];
result = prime * result + [self.inserted hash];
result = prime * result + [self.changed hash];
return result;
}
- (NSString *)description {
NSMutableString *description = [NSMutableString stringWithString:[super description]];
[description appendString:@" {\n"];
if ([self.deleted count] > 0) {
[description appendFormat:@" Deleted: %@\n", [self descriptionForIndexes:self.deleted]];
}
if ([self.inserted count] > 0) {
[description appendFormat:@" Inserted: %@\n", [self descriptionForIndexes:self.inserted]];
}
if ([self.changed count] > 0) {
[description appendFormat:@" Changed: %@\n", [self descriptionForChanged:self.changed]];
}
[description appendString:@"}"];
return description;
}
- (NSString *)descriptionForIndexes:(NSIndexSet *)indexSet {
NSMutableArray *strings = [NSMutableArray array];
[indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
[strings addObject:[NSString stringWithFormat:@"%@", @(idx)]];
}];
return [strings componentsJoinedByString:@", "];
}
- (NSString *)descriptionForChanged:(NSSet *)set {
NSArray *sortedChanges = [[set allObjects] sortedArrayUsingComparator:^NSComparisonResult(NNArrayDiffChange *obj1, NNArrayDiffChange *obj2) {
if (obj1.before != obj2.before) {
return obj1.before < obj2.before ? NSOrderedAscending : NSOrderedDescending;
}
if (obj1.after != obj2.after) {
return obj1.after < obj2.after ? NSOrderedAscending : NSOrderedDescending;
}
return NSOrderedSame;
}];
NSMutableArray *strings = [NSMutableArray array];
for (NNArrayDiffChange *change in sortedChanges) {
[strings addObject:[change description]];
};
return [strings componentsJoinedByString:@", "];
}
@end
@implementation NNMutableArrayDiff
- (instancetype)initWithDeleted:(NSIndexSet *)deleted inserted:(NSIndexSet *)inserted changed:(NSSet *)changed {
self = [super initWithDeleted:deleted inserted:inserted changed:changed];
if (!self) return nil;
_deleted = [_deleted mutableCopy];
_inserted = [_inserted mutableCopy];
_changed = [_changed mutableCopy];
return self;
}
@dynamic deleted;
@dynamic inserted;
@dynamic changed;
@end