Skip to content

Commit e2822a4

Browse files
authored
Merge pull request #12 from SwiftRex/MiddlewareIO
Update SwiftRex to use Middleware IO
2 parents 3c13c03 + c2e2678 commit e2822a4

File tree

4 files changed

+70
-83
lines changed

4 files changed

+70
-83
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ let package = Package(
1212
.library(name: "LoggerMiddleware", targets: ["LoggerMiddleware"])
1313
],
1414
dependencies: [
15-
.package(url: "https://github.com/SwiftRex/SwiftRex.git", .upToNextMajor(from: "0.8.6"))
15+
.package(url: "https://github.com/SwiftRex/SwiftRex.git", .upToNextMajor(from: "0.8.8"))
1616
],
1717
targets: [
1818
.target(

Sources/LoggerMiddleware/LoggerMiddleware.swift

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,31 @@ import Foundation
22
import os.log
33
import SwiftRex
44

5-
extension Middleware where StateType: Equatable {
5+
extension MiddlewareProtocol where StateType: Equatable {
66
public func logger(
7-
actionTransform: LoggerMiddleware<Self>.ActionTransform = .default(),
8-
actionPrinter: LoggerMiddleware<Self>.ActionLogger = .osLog,
7+
actionTransform: LoggerMiddleware<InputActionType, StateType>.ActionTransform = .default(),
8+
actionPrinter: LoggerMiddleware<InputActionType, StateType>.ActionLogger = .osLog,
99
actionFilter: @escaping (InputActionType) -> Bool = { _ in true },
10-
stateDiffTransform: LoggerMiddleware<Self>.StateDiffTransform = .diff(),
11-
stateDiffPrinter: LoggerMiddleware<Self>.StateLogger = .osLog,
10+
stateDiffTransform: LoggerMiddleware<InputActionType, StateType>.StateDiffTransform = .diff(),
11+
stateDiffPrinter: LoggerMiddleware<InputActionType, StateType>.StateLogger = .osLog,
1212
queue: DispatchQueue = .main
13-
) -> LoggerMiddleware<Self> {
13+
) -> ComposedMiddleware<InputActionType, OutputActionType, StateType> {
1414
LoggerMiddleware(
15-
self,
1615
actionTransform: actionTransform,
1716
actionPrinter: actionPrinter,
1817
actionFilter: actionFilter,
1918
stateDiffTransform: stateDiffTransform,
2019
stateDiffPrinter: stateDiffPrinter,
2120
queue: queue
22-
)
21+
).lift(outputAction: { (_: Never) -> OutputActionType in }) <> self
2322
}
2423
}
2524

26-
public final class LoggerMiddleware<M: Middleware>: Middleware where M.StateType: Equatable {
27-
public typealias InputActionType = M.InputActionType
28-
public typealias OutputActionType = M.OutputActionType
29-
public typealias StateType = M.StateType
30-
private let middleware: M
25+
public final class LoggerMiddleware<Action, State: Equatable>: MiddlewareProtocol {
26+
public typealias InputActionType = Action
27+
public typealias OutputActionType = Never
28+
public typealias StateType = State
29+
3130
private let queue: DispatchQueue
3231
private var getState: GetState<StateType>?
3332
private let actionTransform: ActionTransform
@@ -37,15 +36,13 @@ public final class LoggerMiddleware<M: Middleware>: Middleware where M.StateType
3736
private let stateDiffPrinter: StateLogger
3837

3938
init(
40-
_ middleware: M,
4139
actionTransform: ActionTransform,
4240
actionPrinter: ActionLogger,
4341
actionFilter: @escaping (InputActionType) -> Bool = { _ in true },
4442
stateDiffTransform: StateDiffTransform,
4543
stateDiffPrinter: StateLogger,
4644
queue: DispatchQueue
4745
) {
48-
self.middleware = middleware
4946
self.actionTransform = actionTransform
5047
self.actionPrinter = actionPrinter
5148
self.actionFilter = actionFilter
@@ -54,19 +51,11 @@ public final class LoggerMiddleware<M: Middleware>: Middleware where M.StateType
5451
self.queue = queue
5552
}
5653

57-
public func receiveContext(getState: @escaping GetState<StateType>, output: AnyActionHandler<OutputActionType>) {
58-
self.getState = getState
59-
middleware.receiveContext(getState: getState, output: output)
60-
}
61-
62-
public func handle(action: InputActionType, from dispatcher: ActionSource, afterReducer: inout AfterReducer) {
63-
guard actionFilter(action) else { return }
54+
public func handle(action: Action, from dispatcher: ActionSource, state: @escaping GetState<State>) -> IO<Never> {
55+
guard actionFilter(action) else { return .pure() }
6456
let stateBefore = getState?()
65-
var innerAfterReducer = AfterReducer.doNothing()
66-
67-
middleware.handle(action: action, from: dispatcher, afterReducer: &innerAfterReducer)
6857

69-
afterReducer = innerAfterReducer <> .do { [weak self] in
58+
return IO { [weak self] _ in
7059
guard let self = self,
7160
let stateAfter = self.getState?() else { return }
7261

@@ -83,15 +72,14 @@ public final class LoggerMiddleware<M: Middleware>: Middleware where M.StateType
8372

8473
extension LoggerMiddleware {
8574
public static func `default`(
86-
actionTransform: LoggerMiddleware<IdentityMiddleware<InputActionType, OutputActionType, StateType>>.ActionTransform = .default(),
87-
actionPrinter: LoggerMiddleware<IdentityMiddleware<InputActionType, OutputActionType, StateType>>.ActionLogger = .osLog,
75+
actionTransform: LoggerMiddleware<InputActionType, StateType>.ActionTransform = .default(),
76+
actionPrinter: LoggerMiddleware<InputActionType, StateType>.ActionLogger = .osLog,
8877
actionFilter: @escaping (InputActionType) -> Bool = { _ in true },
89-
stateDiffTransform: LoggerMiddleware<IdentityMiddleware<InputActionType, OutputActionType, StateType>>.StateDiffTransform = .diff(),
90-
stateDiffPrinter: LoggerMiddleware<IdentityMiddleware<InputActionType, OutputActionType, StateType>>.StateLogger = .osLog,
78+
stateDiffTransform: LoggerMiddleware<InputActionType, StateType>.StateDiffTransform = .diff(),
79+
stateDiffPrinter: LoggerMiddleware<InputActionType, StateType>.StateLogger = .osLog,
9180
queue: DispatchQueue = .main
92-
) -> LoggerMiddleware<IdentityMiddleware<InputActionType, OutputActionType, StateType>> {
81+
) -> LoggerMiddleware<InputActionType, StateType> {
9382
.init(
94-
IdentityMiddleware(),
9583
actionTransform: actionTransform,
9684
actionPrinter: actionPrinter,
9785
actionFilter: actionFilter,

Tests/LoggerMiddlewareTests/LoggerMiddlewareTests.swift

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,42 +17,41 @@ struct Substate: Equatable {
1717
public let z: Bool
1818
}
1919

20-
struct TestMiddleware: Middleware {
21-
func receiveContext(getState: @escaping GetState<TestState>, output: AnyActionHandler<Int>) {
20+
struct TestMiddleware: MiddlewareProtocol {
21+
22+
func handle(action: Int, from dispatcher: ActionSource, state: @escaping GetState<TestState>) -> IO<Int> {
23+
.pure()
2224
}
23-
24-
func handle(action: Int, from dispatcher: ActionSource, afterReducer: inout AfterReducer) {
25-
}
26-
25+
2726
typealias InputActionType = Int
2827
typealias OutputActionType = Int
2928
typealias StateType = TestState
3029
}
3130

3231
final class LoggerMiddlewareTests: XCTestCase {
33-
32+
3433
func testStateDiff() {
3534
// given
36-
let beforeState: LoggerMiddleware<TestMiddleware>.StateType = TestState(a: Substate(x: ["SetB", "SetA"],
37-
y1: ["one": 1, "eleven": 11],
38-
y2: ["one": 1, "eleven": 11, "zapp": 42],
39-
z: true),
40-
b: [0, 1],
41-
c: "Foo",
42-
d: "",
43-
e: nil)
44-
let afterState: LoggerMiddleware<TestMiddleware>.StateType = TestState(a: Substate(x: ["SetB", "SetC"],
45-
y1: ["one": 1, "twelve": 12],
46-
y2: ["one": 1, "twelve": 12, "zapp": nil],
47-
z: false),
48-
b: [0],
49-
c: "Bar",
50-
d: nil,
51-
e: "🥚")
52-
35+
let beforeState = TestState(a: Substate(x: ["SetB", "SetA"],
36+
y1: ["one": 1, "eleven": 11],
37+
y2: ["one": 1, "eleven": 11, "zapp": 42],
38+
z: true),
39+
b: [0, 1],
40+
c: "Foo",
41+
d: "",
42+
e: nil)
43+
let afterState = TestState(a: Substate(x: ["SetB", "SetC"],
44+
y1: ["one": 1, "twelve": 12],
45+
y2: ["one": 1, "twelve": 12, "zapp": nil],
46+
z: false),
47+
b: [0],
48+
c: "Bar",
49+
d: nil,
50+
e: "🥚")
51+
5352
// when
54-
let result: String? = LoggerMiddleware<TestMiddleware>.recursiveDiff(prefixLines: "🏛", stateName: "TestState", before: beforeState, after: afterState)
55-
53+
let result: String? = LoggerMiddleware<Int, TestState>.recursiveDiff(prefixLines: "🏛", stateName: "TestState", before: beforeState, after: afterState)
54+
5655
// then
5756
let expected = """
5857
🏛 TestState.a.x: 📦 <SetA, SetB> → <SetB, SetC>
@@ -66,37 +65,37 @@ final class LoggerMiddlewareTests: XCTestCase {
6665
"""
6766
XCTAssertEqual(result, expected)
6867
}
69-
70-
68+
69+
7170
func testStateDiffWithFilters() {
7271
// given
73-
let beforeState: LoggerMiddleware<TestMiddleware>.StateType = TestState(a: Substate(x: ["SetB", "SetA"],
74-
y1: ["one": 1, "eleven": 11],
75-
y2: ["one": 1, "eleven": 11, "zapp": 42],
76-
z: true),
77-
b: [0, 1],
78-
c: "Foo",
79-
d: "",
80-
e: nil)
81-
let afterState: LoggerMiddleware<TestMiddleware>.StateType = TestState(a: Substate(x: ["SetB", "SetC"],
82-
y1: ["one": 1, "twelve": 12],
83-
y2: ["one": 1, "twelve": 12, "zapp": nil],
84-
z: false),
85-
b: [0],
86-
c: "Bar",
87-
d: nil,
88-
e: "🥚")
89-
72+
let beforeState = TestState(a: Substate(x: ["SetB", "SetA"],
73+
y1: ["one": 1, "eleven": 11],
74+
y2: ["one": 1, "eleven": 11, "zapp": 42],
75+
z: true),
76+
b: [0, 1],
77+
c: "Foo",
78+
d: "",
79+
e: nil)
80+
let afterState = TestState(a: Substate(x: ["SetB", "SetC"],
81+
y1: ["one": 1, "twelve": 12],
82+
y2: ["one": 1, "twelve": 12, "zapp": nil],
83+
z: false),
84+
b: [0],
85+
c: "Bar",
86+
d: nil,
87+
e: "🥚")
88+
9089
// when
91-
let result: String? = LoggerMiddleware<TestMiddleware>.recursiveDiff(prefixLines: "🏛",
90+
let result: String? = LoggerMiddleware<Int, TestState>.recursiveDiff(prefixLines: "🏛",
9291
stateName: "TestState",
9392
filters: [
9493
" TestState.a.y2",
9594
" TestState.b.#"
9695
],
9796
before: beforeState,
9897
after: afterState)
99-
98+
10099
// then
101100
let expected = """
102101
🏛 TestState.a.x: 📦 <SetA, SetB> → <SetB, SetC>
@@ -108,7 +107,7 @@ final class LoggerMiddlewareTests: XCTestCase {
108107
"""
109108
XCTAssertEqual(result, expected)
110109
}
111-
110+
112111
static var allTests = [
113112
("testStateDiff", testStateDiff),
114113
]

0 commit comments

Comments
 (0)