Skip to content
This repository was archived by the owner on Jul 2, 2021. It is now read-only.

Commit 5449941

Browse files
authored
Merge pull request #31 from UrbanCompass/skip-first
add skip first
2 parents 80a95e8 + 6e91852 commit 5449941

3 files changed

Lines changed: 36 additions & 0 deletions

File tree

snail-kotlin/src/main/java/com/compass/snail/IObservable.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ interface IObservable<T> {
1414
suspend fun block(): BlockResult<T>
1515
fun throttle(delayMs: Long): Observable<T>
1616
fun debounce(delayMs: Long): Observable<T>
17+
fun skip(first: UInt): Observable<T>
1718
}

snail-kotlin/src/main/java/com/compass/snail/Observable.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import kotlinx.coroutines.CoroutineDispatcher
77
import kotlinx.coroutines.GlobalScope
88
import kotlinx.coroutines.launch
99
import java.util.concurrent.Semaphore
10+
import kotlin.math.max
1011

1112
open class Observable<T> : IObservable<T> {
1213
private var isStopped = 0
@@ -145,4 +146,21 @@ open class Observable<T> : IObservable<T> {
145146
}, error = { observable.error(it) }, done = { observable.done() })
146147
return observable
147148
}
149+
150+
override fun skip(first: UInt): Observable<T> {
151+
val observable = Observable<T>()
152+
var count = first.toInt()
153+
subscribe(next = {
154+
if (count == 0) {
155+
observable.next(it)
156+
}
157+
count = max(count - 1, 0)
158+
}, error = {
159+
observable.error(it)
160+
}, done = {
161+
observable.done()
162+
})
163+
164+
return observable
165+
}
148166
}

snail-kotlin/src/test/java/com/compass/snail/ObservableTests.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,4 +190,21 @@ class ObservableTests {
190190
assertEquals(received.count(), 1)
191191
assertEquals(received.first(), "2")
192192
}
193+
194+
@Test
195+
fun testSkipFirst() {
196+
val observable = Observable<String>()
197+
var received = mutableListOf<String>()
198+
199+
observable.skip(2.toUInt()).subscribe(next = {
200+
received.add(it)
201+
202+
assertEquals(received.count(), 1)
203+
assertEquals(received.first(), "3")
204+
})
205+
206+
observable.next("1")
207+
observable.next("2")
208+
observable.next("3")
209+
}
193210
}

0 commit comments

Comments
 (0)