-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathDataSource.swift
87 lines (70 loc) · 2.02 KB
/
DataSource.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
/// A wrapper for clusure-based interaction between objects
///
/// Provides a public API to set internal closure-based datasource with a functional API
@propertyWrapper
public class DataSource<Input, Output> {
public struct Container {
@usableFromInline
internal var action: (Input) -> Output
public init(action: @escaping (Input) -> Output) {
self.action = action
}
@inlinable
public mutating func callAsFunction(perform action: @escaping (Input) -> Output) {
self.action = action
}
}
public init(wrappedValue: Container) {
self.wrappedValue = wrappedValue
}
public var wrappedValue: Container
@inlinable
public var projectedValue: (Input) -> Output {
get { wrappedValue.action }
set { wrappedValue.action = newValue }
}
@inlinable
public func callAsFunction(_ input: Input) -> Output? {
projectedValue(input)
}
@inlinable
public func callAsFunction() -> Output where Input == Void {
projectedValue(())
}
}
/// A wrapper for clusure-based interaction between objects
///
/// Provides a public API to set internal closure-based datasource with a functional API
@propertyWrapper
public class OptionalDataSource<Input, Output> {
public struct Container {
@usableFromInline
internal var action: ((Input) -> Output)?
internal init() {}
public init(action: ((Input) -> Output)?) {
self.action = action
}
@inlinable
public mutating func callAsFunction(perform action: ((Input) -> Output)?) {
self.action = action
}
}
public init() {}
public init(wrappedValue: Container) {
self.wrappedValue = wrappedValue
}
public var wrappedValue: Container = .init()
@inlinable
public var projectedValue: ((Input) -> Output)? {
get { wrappedValue.action }
set { wrappedValue.action = newValue }
}
@inlinable
public func callAsFunction(_ input: Input) -> Output? {
projectedValue?(input)
}
@inlinable
public func callAsFunction() -> Output? where Input == Void {
projectedValue?(())
}
}