Prechádzať zdrojové kódy

Observable.skipLast;

bjorn 9 rokov pred
rodič
commit
b01c57ff5f
6 zmenil súbory, kde vykonal 96 pridanie a 0 odobranie
  1. 11 0
      doc/README.md
  2. 32 0
      rx.lua
  3. 34 0
      src/operators/skipLast.lua
  4. 1 0
      tests/observable.lua
  5. 17 0
      tests/skipLast.lua
  6. 1 0
      tools/concat.lua

+ 11 - 0
doc/README.md

@@ -58,6 +58,7 @@ RxLua
   - [skip](#skipn)
   - [skipUntil](#skipuntilother)
   - [skipWhile](#skipwhilepredicate)
+  - [skipLast](#skiplastcount)
   - [startWith](#startwithvalues)
   - [sum](#sum)
   - [take](#taken)
@@ -595,6 +596,16 @@ Returns a new Observable that skips elements until the predicate returns falsy f
 
 ---
 
+#### `:skipLast(count)`
+
+Returns an Observable that omits a specified number of values from the end of the original Observable.
+
+| Name | Type | Default | Description |
+|------|------|---------|-------------|
+| `count` | number |  | The number of items to omit from the end. |
+
+---
+
 #### `:startWith(values)`
 
 Returns a new Observable that produces the specified values followed by all elements produced by the source Observable.

+ 32 - 0
rx.lua

@@ -1217,6 +1217,38 @@ function Observable:skipWhile(predicate)
   end)
 end
 
+--- Returns an Observable that omits a specified number of values from the end of the original
+-- Observable.
+-- @arg {number} count - The number of items to omit from the end.
+-- @returns {Observable}
+function Observable:skipLast(count)
+  local buffer = {}
+  return Observable.create(function(observer)
+    local function emit()
+      if #buffer > count and buffer[1] then
+        local values = table.remove(buffer, 1)
+        observer:onNext(util.unpack(values))
+      end
+    end
+
+    local function onNext(...)
+      emit()
+      table.insert(buffer, util.pack(...))
+    end
+
+    local function onError(message)
+      return observer:onError(message)
+    end
+
+    local function onCompleted()
+      emit()
+      return observer:onCompleted()
+    end
+
+    return self:subscribe(onNext, onError, onCompleted)
+  end)
+end
+
 --- Returns a new Observable that produces the specified values followed by all elements produced by
 -- the source Observable.
 -- @arg {*...} values - The values to produce before the Observable begins producing values

+ 34 - 0
src/operators/skipLast.lua

@@ -0,0 +1,34 @@
+local Observable = require 'observable'
+local util = require 'util'
+
+--- Returns an Observable that omits a specified number of values from the end of the original
+-- Observable.
+-- @arg {number} count - The number of items to omit from the end.
+-- @returns {Observable}
+function Observable:skipLast(count)
+  local buffer = {}
+  return Observable.create(function(observer)
+    local function emit()
+      if #buffer > count and buffer[1] then
+        local values = table.remove(buffer, 1)
+        observer:onNext(util.unpack(values))
+      end
+    end
+
+    local function onNext(...)
+      emit()
+      table.insert(buffer, util.pack(...))
+    end
+
+    local function onError(message)
+      return observer:onError(message)
+    end
+
+    local function onCompleted()
+      emit()
+      return observer:onCompleted()
+    end
+
+    return self:subscribe(onNext, onError, onCompleted)
+  end)
+end

+ 1 - 0
tests/observable.lua

@@ -264,6 +264,7 @@ describe('Observable', function()
   dofile('tests/skip.lua')
   dofile('tests/skipUntil.lua')
   dofile('tests/skipWhile.lua')
+  dofile('tests/skipLast.lua')
   dofile('tests/startWith.lua')
   dofile('tests/sum.lua')
   dofile('tests/take.lua')

+ 17 - 0
tests/skipLast.lua

@@ -0,0 +1,17 @@
+describe('skipLast', function()
+  it('produces an error if its parent errors', function()
+    expect(Rx.Observable.throw():skipLast(1).subscribe).to.fail()
+  end)
+
+  it('fails if the count is not specified', function()
+    expect(Rx.Observable.fromRange(3):skipLast().subscribe).to.fail()
+  end)
+
+  it('skips the specified number of values from the end of the source Observable', function()
+    expect(Rx.Observable.fromRange(5):skipLast(2)).to.produce(1, 2, 3)
+  end)
+
+  it('produces all elements produced by the source if the count is less than or equal to zero', function()
+    expect(Rx.Observable.fromRange(3):skipLast(-1)).to.produce(1, 2, 3)
+  end)
+end)

+ 1 - 0
tools/concat.lua

@@ -42,6 +42,7 @@ local files = {
   'src/operators/skip.lua',
   'src/operators/skipUntil.lua',
   'src/operators/skipWhile.lua',
+  'src/operators/skipLast.lua',
   'src/operators/startWith.lua',
   'src/operators/sum.lua',
   'src/operators/take.lua',