-
Notifications
You must be signed in to change notification settings - Fork 500
/
Copy pathNumberSection.swift
101 lines (79 loc) · 2.14 KB
/
NumberSection.swift
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
//
// NumberSection.swift
// RxDataSources
//
// Created by Krunoslav Zaher on 1/7/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
import Foundation
import Differentiator
import RxDataSources
// MARK: Data
struct NumberSection {
var header: String
var numbers: [IntItem]
var updated: Date
init(header: String, numbers: [Item], updated: Date) {
self.header = header
self.numbers = numbers
self.updated = updated
}
}
struct IntItem {
let number: Int
let date: Date
}
// MARK: Just extensions to say how to determine identity and how to determine is entity updated
extension NumberSection
: AnimatableSectionModelType {
typealias Item = IntItem
typealias Identity = String
var identity: String {
return header
}
var items: [IntItem] {
return numbers
}
init(original: NumberSection, items: [Item]) {
self = original
self.numbers = items
}
}
extension NumberSection
: CustomDebugStringConvertible {
var debugDescription: String {
let interval = updated.timeIntervalSince1970
let numbersDescription = numbers.map { "\n\($0.debugDescription)" }.joined(separator: "")
return "NumberSection(header: \"\(self.header)\", numbers: \(numbersDescription)\n, updated: \(interval))"
}
}
extension IntItem
: IdentifiableType
, Equatable {
typealias Identity = Int
var identity: Int {
return number
}
}
// equatable, this is needed to detect changes
func == (lhs: IntItem, rhs: IntItem) -> Bool {
return lhs.number == rhs.number && lhs.date == rhs.date
}
// MARK: Some nice extensions
extension IntItem
: CustomDebugStringConvertible {
var debugDescription: String {
return "IntItem(number: \(number), date: \(date.timeIntervalSince1970))"
}
}
extension IntItem
: CustomStringConvertible {
var description: String {
return "\(number)"
}
}
extension NumberSection: Equatable {
}
func == (lhs: NumberSection, rhs: NumberSection) -> Bool {
return lhs.header == rhs.header && lhs.items == rhs.items && lhs.updated == rhs.updated
}