Browse Source

Observable.flatMap;

John OConnor 9 years ago
parent
commit
3ee0f2534d
6 changed files with 55 additions and 0 deletions
  1. 11 0
      doc/README.md
  2. 9 0
      rx.lua
  3. 11 0
      src/operators/flatMap.lua
  4. 22 0
      tests/flatMap.lua
  5. 1 0
      tests/observable.lua
  6. 1 0
      tools/concat.lua

+ 11 - 0
doc/README.md

@@ -36,6 +36,7 @@ RxLua
   - [filter](#filterpredicate)
   - [find](#findpredicate)
   - [first](#first)
+  - [flatMap](#flatmapcallback)
   - [flatten](#flatten)
   - [last](#last)
   - [map](#mapcallback)
@@ -386,6 +387,16 @@ Returns a new Observable that only produces the first result of the original.
 
 ---
 
+#### `:flatMap(callback)`
+
+Returns a new Observable that transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable
+
+| Name | Type | Default | Description |
+|------|------|---------|-------------|
+| `callback` | function |  | The function to transform values from the original Observable. |
+
+---
+
 #### `:flatten()`
 
 Returns a new Observable that subscribes to the Observables produced by the original and produces their values.

+ 9 - 0
rx.lua

@@ -701,6 +701,15 @@ function Observable:first()
   return self:take(1)
 end
 
+--- Returns a new Observable that transform the items emitted by an Observable into Observables,
+-- then flatten the emissions from those into a single Observable
+-- @arg {function} callback - The function to transform values from the original Observable.
+-- @returns {Observable}
+function Observable:flatMap(callback)
+  callback = callback or util.identity
+  return self:map(callback):flatten()
+end
+
 --- Returns a new Observable that subscribes to the Observables produced by the original and
 -- produces their values.
 -- @returns {Observable}

+ 11 - 0
src/operators/flatMap.lua

@@ -0,0 +1,11 @@
+local Observable = require 'observable'
+local util = require 'util'
+
+--- Returns a new Observable that transform the items emitted by an Observable into Observables,
+-- then flatten the emissions from those into a single Observable
+-- @arg {function} callback - The function to transform values from the original Observable.
+-- @returns {Observable}
+function Observable:flatMap(callback)
+  callback = callback or util.identity
+  return self:map(callback):flatten()
+end

+ 22 - 0
tests/flatMap.lua

@@ -0,0 +1,22 @@
+describe('flatMap', function()
+  it('produces an error if its parent errors', function()
+    local observable = Rx.Observable.fromValue(''):flatMap(function(x) return x() end)
+    expect(observable.subscribe).to.fail()
+  end)
+
+  it('uses the identity function as the callback if none is specified', function()
+    local observable = Rx.Observable.fromTable{
+      Rx.Observable.fromRange(3),
+      Rx.Observable.fromRange(5)
+    }:flatMap()
+    expect(observable).to.produce(1, 2, 3, 1, 2, 3, 4, 5)
+  end)
+
+  it('produces all values produced by the observables produced by its parent', function()
+    local observable = Rx.Observable.fromRange(3):flatMap(function(i)
+      return Rx.Observable.fromRange(i, 3)
+    end)
+
+    expect(observable).to.produce(1, 2, 3, 2, 3, 3)
+  end)
+end)

+ 1 - 0
tests/observable.lua

@@ -193,6 +193,7 @@ describe('Observable', function()
   dofile('tests/filter.lua')
   dofile('tests/find.lua')
   dofile('tests/first.lua')
+  dofile('tests/flatMap.lua')
   dofile('tests/flatten.lua')
   dofile('tests/last.lua')
   dofile('tests/map.lua')

+ 1 - 0
tools/concat.lua

@@ -22,6 +22,7 @@ local files = {
   'src/operators/filter.lua',
   'src/operators/find.lua',
   'src/operators/first.lua',
+  'src/operators/flatMap.lua',
   'src/operators/flatten.lua',
   'src/operators/last.lua',
   'src/operators/map.lua',