Skip to content

Commit a9efe42

Browse files
committed
Remove internal class from the sequence
1 parent 0887134 commit a9efe42

File tree

4 files changed

+22
-84
lines changed

4 files changed

+22
-84
lines changed

Sources/AsyncAlgorithms/Merge/AsyncMerge2Sequence.swift

+10-29
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,8 @@ public struct AsyncMerge2Sequence<
3232
{
3333
public typealias Element = Base1.Element
3434

35-
/// This class is needed to hook the deinit to observe once all references to the ``AsyncMerge2Sequence`` are dropped.
36-
///
37-
/// If we get move-only types we should be able to drop this class and use the `deinit` of the ``AsyncMerge2Sequence`` struct itself.
38-
final class InternalClass: Sendable {
39-
fileprivate let storage: MergeStorage<Base1, Base2, Base1>
40-
41-
fileprivate init(storage: MergeStorage<Base1, Base2, Base1>) {
42-
self.storage = storage
43-
}
44-
45-
deinit {
46-
storage.sequenceDeinitialized()
47-
}
48-
}
49-
50-
/// The internal class to hook the `deinit`.
51-
let internalClass: InternalClass
52-
53-
/// The underlying storage
54-
fileprivate var storage: MergeStorage<Base1, Base2, Base1> {
55-
internalClass.storage
56-
}
35+
private let base1: Base1
36+
private let base2: Base2
5737

5838
/// Initializes a new ``AsyncMerge2Sequence``.
5939
///
@@ -64,18 +44,19 @@ public struct AsyncMerge2Sequence<
6444
_ base1: Base1,
6545
_ base2: Base2
6646
) {
67-
let storage = MergeStorage<Base1, Base2, Base1>(
68-
base1: base1,
69-
base2: base2,
70-
base3: nil
71-
)
72-
internalClass = .init(storage: storage)
47+
self.base1 = base1
48+
self.base2 = base2
7349
}
7450
}
7551

7652
extension AsyncMerge2Sequence: AsyncSequence {
7753
public func makeAsyncIterator() -> AsyncIterator {
78-
AsyncIterator(storage: internalClass.storage)
54+
let storage = MergeStorage<Base1, Base2, Base1>(
55+
base1: base1,
56+
base2: base2,
57+
base3: nil
58+
)
59+
return AsyncIterator(storage: storage)
7960
}
8061
}
8162

Sources/AsyncAlgorithms/Merge/AsyncMerge3Sequence.swift

+12-29
Original file line numberDiff line numberDiff line change
@@ -39,28 +39,9 @@ public struct AsyncMerge3Sequence<
3939
{
4040
public typealias Element = Base1.Element
4141

42-
/// This class is needed to hook the deinit to observe once all references to the ``AsyncMerge2Sequence`` are dropped.
43-
///
44-
/// If we get move-only types we should be able to drop this class and use the `deinit` of the ``AsyncMerge2Sequence`` struct itself.
45-
final class InternalClass: Sendable {
46-
fileprivate let storage: MergeStorage<Base1, Base2, Base3>
47-
48-
fileprivate init(storage: MergeStorage<Base1, Base2, Base3>) {
49-
self.storage = storage
50-
}
51-
52-
deinit {
53-
storage.sequenceDeinitialized()
54-
}
55-
}
56-
57-
/// The internal class to hook the `deinit`.
58-
let internalClass: InternalClass
59-
60-
/// The underlying storage
61-
fileprivate var storage: MergeStorage<Base1, Base2, Base3> {
62-
internalClass.storage
63-
}
42+
private let base1: Base1
43+
private let base2: Base2
44+
private let base3: Base3
6445

6546
/// Initializes a new ``AsyncMerge2Sequence``.
6647
///
@@ -73,18 +54,20 @@ public struct AsyncMerge3Sequence<
7354
_ base2: Base2,
7455
_ base3: Base3
7556
) {
76-
let storage = MergeStorage<Base1, Base2, Base3>(
77-
base1: base1,
78-
base2: base2,
79-
base3: base3
80-
)
81-
internalClass = .init(storage: storage)
57+
self.base1 = base1
58+
self.base2 = base2
59+
self.base3 = base3
8260
}
8361
}
8462

8563
extension AsyncMerge3Sequence: AsyncSequence {
8664
public func makeAsyncIterator() -> AsyncIterator {
87-
AsyncIterator(storage: internalClass.storage)
65+
let storage = MergeStorage(
66+
base1: base1,
67+
base2: base2,
68+
base3: base3
69+
)
70+
return AsyncIterator(storage: storage)
8871
}
8972
}
9073

Sources/AsyncAlgorithms/Merge/MergeStateMachine.swift

-22
Original file line numberDiff line numberDiff line change
@@ -82,28 +82,6 @@ struct MergeStateMachine<
8282
}
8383
}
8484

85-
mutating func sequenceDeinitialized() {
86-
switch state {
87-
case .initial:
88-
// The references to the sequence were dropped before any iterator was ever created
89-
state = .finished
90-
91-
case .merging, .upstreamFailure:
92-
// An iterator was created and we deinited the sequence.
93-
// This is an expected pattern and we just continue on normal.
94-
// Importantly since we are a unicast sequence no more iterators can be created
95-
return
96-
97-
case .finished:
98-
// We are already finished so there is nothing left to clean up.
99-
// This is just the references dropping afterwards.
100-
return
101-
102-
case .modifying:
103-
preconditionFailure("Invalid state")
104-
}
105-
}
106-
10785
/// Actions returned by `iteratorInitialized()`.
10886
enum IteratorInitializedAction {
10987
/// Indicates that a new `Task` should be created that consumed the sequences.

Sources/AsyncAlgorithms/Merge/MergeStorage.swift

-4
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ final class MergeStorage<
3838
self.lock.deinitialize()
3939
}
4040

41-
func sequenceDeinitialized() {
42-
lock.withLock { self.stateMachine.sequenceDeinitialized() }
43-
}
44-
4541
func iteratorInitialized() {
4642
lock.withLockVoid {
4743
let action = self.stateMachine.iteratorInitialized()

0 commit comments

Comments
 (0)