@@ -62,18 +62,21 @@ public fun <T> Flow<T>.delayEach(timeMillis: Long): Flow<T> = flow {
62
62
public fun <T > Flow<T>.debounce (timeoutMillis : Long ): Flow <T > {
63
63
require(timeoutMillis > 0 ) { " Debounce timeout should be positive" }
64
64
return scopedFlow { downstream ->
65
- val values = Channel <Any ?>(Channel .CONFLATED ) // Actually Any, KT-30796
66
- // Channel is not closed deliberately as there is no close with value
67
- val collector = async {
68
- collect { value -> values.send(value ? : NULL ) }
65
+ // Actually Any, KT-30796
66
+ val values = produce<Any ?>(capacity = Channel .CONFLATED ) {
67
+ collect { value -> send(value ? : NULL ) }
69
68
}
70
-
71
- var isDone = false
72
69
var lastValue: Any? = null
73
- while (! isDone ) {
70
+ while (lastValue != = DONE ) {
74
71
select<Unit > {
75
- values.onReceive {
76
- lastValue = it
72
+ // Should be receiveOrClosed when boxing issues are fixed
73
+ values.onReceiveOrNull {
74
+ if (it == null ) {
75
+ if (lastValue != null ) downstream.emit(NULL .unbox(lastValue))
76
+ lastValue = DONE
77
+ } else {
78
+ lastValue = it
79
+ }
77
80
}
78
81
79
82
lastValue?.let { value ->
@@ -83,12 +86,6 @@ public fun <T> Flow<T>.debounce(timeoutMillis: Long): Flow<T> {
83
86
downstream.emit(NULL .unbox(value))
84
87
}
85
88
}
86
-
87
- // Close with value 'idiom'
88
- collector.onAwait {
89
- if (lastValue != null ) downstream.emit(NULL .unbox(lastValue))
90
- isDone = true
91
- }
92
89
}
93
90
}
94
91
}
@@ -118,16 +115,14 @@ public fun <T> Flow<T>.sample(periodMillis: Long): Flow<T> {
118
115
// Actually Any, KT-30796
119
116
collect { value -> send(value ? : NULL ) }
120
117
}
121
-
122
- var isDone = false
123
118
var lastValue: Any? = null
124
119
val ticker = fixedPeriodTicker(periodMillis)
125
- while (! isDone ) {
120
+ while (lastValue != = DONE ) {
126
121
select<Unit > {
127
122
values.onReceiveOrNull {
128
123
if (it == null ) {
129
124
ticker.cancel(ChildCancelledException ())
130
- isDone = true
125
+ lastValue = DONE
131
126
} else {
132
127
lastValue = it
133
128
}
0 commit comments