-
Notifications
You must be signed in to change notification settings - Fork 87
Expand file tree
/
Copy pathPredicate.swift
More file actions
79 lines (61 loc) · 2.99 KB
/
Predicate.swift
File metadata and controls
79 lines (61 loc) · 2.99 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
import Foundation
import CoreData
/// Returns an and predicate from the given predicates
public func && (left: NSPredicate, right: NSPredicate) -> NSPredicate {
return NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.and, subpredicates: [left, right])
}
/// Returns an or predicate from the given predicates
public func || (left: NSPredicate, right: NSPredicate) -> NSPredicate {
return NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.or, subpredicates: [left, right])
}
/// Returns a predicate reversing the given predicate
prefix public func ! (left: NSPredicate) -> NSPredicate {
return NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.not, subpredicates: [left])
}
// MARK: Predicate Type
/// Represents a predicate for a specific model
public struct Predicate<ModelType : NSManagedObject> {
let predicate:NSPredicate
init(predicate:NSPredicate) {
self.predicate = predicate
}
}
public func == <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left == right)
}
public func != <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left != right)
}
public func > <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left > right)
}
public func >= <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left >= right)
}
public func < <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left < right)
}
public func <= <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left <= right)
}
public func ~= <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: AttributeType?) -> Predicate<T> {
return Predicate(predicate: left ~= right)
}
public func << <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: [AttributeType]) -> Predicate<T> {
return Predicate(predicate: left << right)
}
public func << <T: NSManagedObject, AttributeType>(left: Attribute<AttributeType>, right: Range<AttributeType>) -> Predicate<T> {
return Predicate(predicate: left << right)
}
/// Returns an and predicate from the given predicates
public func && <T>(left: Predicate<T>, right: Predicate<T>) -> Predicate<T> {
return Predicate(predicate: left.predicate && right.predicate)
}
/// Returns an or predicate from the given predicates
public func || <T>(left: Predicate<T>, right: Predicate<T>) -> Predicate<T> {
return Predicate(predicate: left.predicate || right.predicate)
}
/// Returns a predicate reversing the given predicate
prefix public func ! <T>(predicate: Predicate<T>) -> Predicate<T> {
return Predicate(predicate: !predicate.predicate)
}