Skip to content

Commit a4f425d

Browse files
authored
Merge pull request #22 from GoodRequest/more-type-erasure
feat: Type-erased mutations
2 parents 3a12c4d + 82823ad commit a4f425d

22 files changed

Lines changed: 705 additions & 195 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
[![iOS Version](https://img.shields.io/badge/iOS_Version->=_13.0-brightgreen?logo=apple&logoColor=green)]()
88
[![Swift Version](https://img.shields.io/badge/Swift_Version-6.0-green?logo=swift)](https://docs.swift.org/swift-book/)
9-
[![Contains Test](https://img.shields.io/badge/Tests-69%25_coverage-blue)]()
9+
[![Contains Test](https://img.shields.io/badge/Tests-83%25_coverage-blue)]()
1010
[![Dependency Manager](https://img.shields.io/badge/Dependency_Manager-SPM-red)](#swiftpackagemanager)
1111

1212
TBD: updated description

Sources/GoodReactor/AnyReactor.swift

Lines changed: 0 additions & 128 deletions
This file was deleted.
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
//
2+
// DataFetchingState.swift
3+
// GoodReactor
4+
//
5+
// Created by Filip Šašala on 21/10/2025.
6+
//
7+
8+
public enum DataFetchingState<T, E: Error> {
9+
10+
case idle
11+
case loading
12+
case success(T)
13+
case failure(E)
14+
15+
}
16+
17+
extension DataFetchingState {
18+
19+
public var isIdle: Bool {
20+
switch self {
21+
case .idle: true
22+
default: false
23+
}
24+
}
25+
26+
public var isLoading: Bool {
27+
switch self {
28+
case .loading: true
29+
default: false
30+
}
31+
}
32+
33+
public var isSuccess: Bool {
34+
switch self {
35+
case .success: true
36+
default: false
37+
}
38+
}
39+
40+
public var isFailure: Bool {
41+
switch self {
42+
case .failure: true
43+
default: false
44+
}
45+
}
46+
47+
public var successValue: T? {
48+
if case .success(let value) = self {
49+
return value
50+
}
51+
return nil
52+
}
53+
54+
public var errorValue: E? {
55+
if case .failure(let error) = self {
56+
return error
57+
}
58+
return nil
59+
}
60+
61+
}
62+
63+
extension DataFetchingState: Sendable where T: Sendable {}
64+
65+
extension DataFetchingState: Equatable where T: Equatable {
66+
67+
nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
68+
switch lhs {
69+
case .idle:
70+
switch rhs {
71+
case .idle:
72+
return true
73+
74+
default:
75+
return false
76+
}
77+
78+
case .loading:
79+
switch rhs {
80+
case .loading:
81+
return true
82+
83+
default:
84+
return false
85+
}
86+
87+
case .success(let lhsValue):
88+
switch rhs {
89+
case .success(let rhsValue):
90+
return lhsValue == rhsValue
91+
92+
default:
93+
return false
94+
}
95+
96+
case .failure(let lhsError):
97+
switch rhs {
98+
case .failure(let rhsError):
99+
// TODO: improve error equality
100+
return lhsError.localizedDescription == rhsError.localizedDescription
101+
102+
default:
103+
return false
104+
}
105+
}
106+
}
107+
108+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// AnyMutation.swift
3+
// GoodReactor
4+
//
5+
// Created by Filip Šašala on 01/10/2025.
6+
//
7+
8+
public struct AnyMutation: Sendable {
9+
10+
internal let `enum`: (Any & Sendable)
11+
12+
internal init<E: Sendable>(_ `enum`: E) {
13+
self.enum = `enum`
14+
}
15+
16+
internal func `as`<T>(_: T.Type) -> T? {
17+
`enum` as? T
18+
}
19+
20+
}

0 commit comments

Comments
 (0)