Skip to content

Commit 09621bf

Browse files
authored
Merge pull request #20 from cats-oss/feature-computed
Add Computed
2 parents b48e8bf + cd5d73b commit 09621bf

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

Unio.xcodeproj/project.pbxproj

+9-5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
9DA555CB2241DE8400EC8CC3 /* BehaviorSubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA555CA2241DE8400EC8CC3 /* BehaviorSubjectType.swift */; };
2727
9DA555D32241FC0400EC8CC3 /* AcceptableRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA555D22241FC0400EC8CC3 /* AcceptableRelay.swift */; };
2828
9DA555D52241FC6600EC8CC3 /* ValueAccessible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA555D42241FC6600EC8CC3 /* ValueAccessible.swift */; };
29+
9DF9334B23FD1091003C564C /* Computed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DF9334A23FD1091003C564C /* Computed.swift */; };
2930
E9A6617E23839933007D4AEC /* AnyUnioStreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A6617D23839933007D4AEC /* AnyUnioStreamTests.swift */; };
3031
E9A6618223839952007D4AEC /* AnyUnioStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A6618123839952007D4AEC /* AnyUnioStream.swift */; };
3132
ED4D482A23DC1B01004868D9 /* AnyLogicBasedStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4D482923DC1B01004868D9 /* AnyLogicBasedStream.swift */; };
@@ -88,6 +89,7 @@
8889
9DA555D22241FC0400EC8CC3 /* AcceptableRelay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcceptableRelay.swift; sourceTree = "<group>"; };
8990
9DA555D42241FC6600EC8CC3 /* ValueAccessible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValueAccessible.swift; sourceTree = "<group>"; };
9091
9DA5623F2362DB760048F2B9 /* Unio.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Unio.xcconfig; sourceTree = "<group>"; };
92+
9DF9334A23FD1091003C564C /* Computed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Computed.swift; sourceTree = "<group>"; };
9193
E9A6617D23839933007D4AEC /* AnyUnioStreamTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyUnioStreamTests.swift; sourceTree = "<group>"; };
9294
E9A6618123839952007D4AEC /* AnyUnioStream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyUnioStream.swift; sourceTree = "<group>"; };
9395
ED4D482923DC1B01004868D9 /* AnyLogicBasedStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyLogicBasedStream.swift; sourceTree = "<group>"; };
@@ -149,6 +151,7 @@
149151
9DA555C92241DE5F00EC8CC3 /* RxTypes */,
150152
ED4D482923DC1B01004868D9 /* AnyLogicBasedStream.swift */,
151153
E9A6618123839952007D4AEC /* AnyUnioStream.swift */,
154+
9DF9334A23FD1091003C564C /* Computed.swift */,
152155
9D2E269C2240D1CA00C9EDF7 /* Dependency.swift */,
153156
9D2E26972240D1CA00C9EDF7 /* ExtraType.swift */,
154157
9D2E267D2240D18500C9EDF7 /* Info.plist */,
@@ -330,19 +333,20 @@
330333
buildActionMask = 2147483647;
331334
files = (
332335
9DA555D32241FC0400EC8CC3 /* AcceptableRelay.swift in Sources */,
336+
ED4D482A23DC1B01004868D9 /* AnyLogicBasedStream.swift in Sources */,
337+
E9A6618223839952007D4AEC /* AnyUnioStream.swift in Sources */,
333338
9D2E26A32240D1CA00C9EDF7 /* BehaviorRelayType.swift in Sources */,
334339
9DA555CB2241DE8400EC8CC3 /* BehaviorSubjectType.swift in Sources */,
340+
9DF9334B23FD1091003C564C /* Computed.swift in Sources */,
335341
9D2E26A62240D1CA00C9EDF7 /* Dependency.swift in Sources */,
336342
9D2E26A12240D1CA00C9EDF7 /* ExtraType.swift in Sources */,
337-
ED4D482A23DC1B01004868D9 /* AnyLogicBasedStream.swift in Sources */,
338343
9D2E26A22240D1CA00C9EDF7 /* InputType.swift in Sources */,
339344
9D2E269F2240D1CA00C9EDF7 /* LogicType.swift in Sources */,
340345
9D2E26A52240D1CA00C9EDF7 /* OutputType.swift in Sources */,
341346
ED6897C122B184EE00B04DA0 /* PrimitiveProperty.swift in Sources */,
342347
9D2E269D2240D1CA00C9EDF7 /* PublishRelayType.swift in Sources */,
343348
9D2E26A02240D1CA00C9EDF7 /* StateType.swift in Sources */,
344349
9D2E26A42240D1CA00C9EDF7 /* UnioStream.swift in Sources */,
345-
E9A6618223839952007D4AEC /* AnyUnioStream.swift in Sources */,
346350
9DA555D52241FC6600EC8CC3 /* ValueAccessible.swift in Sources */,
347351
9D2E269E2240D1CA00C9EDF7 /* Wrappers.swift in Sources */,
348352
);
@@ -352,11 +356,11 @@
352356
isa = PBXSourcesBuildPhase;
353357
buildActionMask = 2147483647;
354358
files = (
355-
ED82DE2C23DC2FF9003B6855 /* SR12081Tests.swift in Sources */,
356-
ED4D482C23DC2BC2004868D9 /* SR12081Check.Streams.swift in Sources */,
357-
ED74A73A2243E0CC00D4E99C /* DependencyTests.swift in Sources */,
358359
E9A6617E23839933007D4AEC /* AnyUnioStreamTests.swift in Sources */,
360+
ED74A73A2243E0CC00D4E99C /* DependencyTests.swift in Sources */,
359361
ED74A63D2243C2EE00D4E99C /* PrimitivePropertyTests.swift in Sources */,
362+
ED4D482C23DC2BC2004868D9 /* SR12081Check.Streams.swift in Sources */,
363+
ED82DE2C23DC2FF9003B6855 /* SR12081Tests.swift in Sources */,
360364
ED74A73C2243E43D00D4E99C /* UnioStreamTests.swift in Sources */,
361365
ED74A7382243D99D00D4E99C /* WrappersTests.swift in Sources */,
362366
);

Unio/Computed.swift

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// Computed.swift
3+
// Unio
4+
//
5+
// Created by marty-suzuki on 2020/2/19.
6+
// Copyright © 2020 tv.abema. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
/// Represents computed property
12+
public final class Computed<Element> {
13+
14+
@inlinable
15+
public var value: Element {
16+
return getter()
17+
}
18+
19+
@usableFromInline
20+
let getter: () -> Element
21+
22+
public init(getter: @escaping () -> Element) {
23+
self.getter = getter
24+
}
25+
26+
public init(capture element: Element) {
27+
self.getter = { [element] in element }
28+
}
29+
30+
public init(_ computed: Computed<Element>) {
31+
self.getter = computed.getter
32+
}
33+
}

Unio/Wrappers.swift

+5
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ public final class OutputWrapper<T: OutputType> {
160160

161161
return _dependency[keyPath: keyPath]
162162
}
163+
164+
public subscript<E>(dynamicMember keyPath: KeyPath<T, Computed<E>>) -> E {
165+
166+
return _dependency[keyPath: keyPath].value
167+
}
163168
}
164169

165170
/// Makes possible to access Observable that contained by T even while hides actual properties (BehaviorRelay, BehaviorSubject and so on).

UnioTests/TestCases/WrappersTests.swift

+20-1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,19 @@ final class WrappersTests: XCTestCase {
196196
XCTAssertEqual(try testTarget.value(for: \.subject), expected)
197197
#endif
198198
}
199+
200+
func testOutput_computed() {
201+
202+
let expected = Int(arc4random())
203+
dependency.outputComputed.accept(expected)
204+
let testTarget = dependency.testTargetOutput
205+
206+
#if swift(>=5.1)
207+
XCTAssertEqual(testTarget.computed, expected)
208+
#else
209+
XCTAssertEqual(testTarget[dynamicMember: \.computed], expected)
210+
#endif
211+
}
199212
}
200213

201214
extension WrappersTests {
@@ -204,6 +217,7 @@ extension WrappersTests {
204217
let subject: BehaviorSubject<String?>
205218
let relay: BehaviorRelay<String?>
206219
let _observable: Observable<String>
220+
let computed: Computed<Int?>
207221
}
208222

209223
private struct Input: InputType {
@@ -221,6 +235,7 @@ extension WrappersTests {
221235

222236
let outputSubject = BehaviorSubject<String?>(value: nil)
223237
let outputRelay = BehaviorRelay<String?>(value: nil)
238+
let outputComputed: BehaviorRelay<Int?>
224239

225240
let acceptForObservable: (String) -> Void
226241

@@ -231,9 +246,13 @@ extension WrappersTests {
231246
let input = Input(relay: inputRelay, subject: inputSubject)
232247
self.testTargetInput = InputWrapper(input)
233248

249+
let computed = BehaviorRelay<Int?>(value: nil)
250+
self.outputComputed = computed
251+
234252
let output = Output(subject: outputSubject,
235253
relay: outputRelay,
236-
_observable: relayForObservable.asObservable())
254+
_observable: relayForObservable.asObservable(),
255+
computed: .init(getter: { computed.value }))
237256
self.testTargetOutput = OutputWrapper(output)
238257
}
239258
}

0 commit comments

Comments
 (0)