Skip to content

Instantly share code, notes, and snippets.

@bouzuya
Last active November 17, 2015 23:21
Show Gist options
  • Select an option

  • Save bouzuya/cc724434cf0cb2803b7b to your computer and use it in GitHub Desktop.

Select an option

Save bouzuya/cc724434cf0cb2803b7b to your computer and use it in GitHub Desktop.
Observable のチェーンを簡素化
# No Scheduler
# No Observer (onError & onCompleted)
# No Disposable
class Observable
@from: (array) ->
new FromObservable(array)
filter: (predicate) ->
new FilterObservable(@, predicate)
map: (selector) ->
new MapObservable(@, selector)
subscribe: (onNext) ->
throw new Error('Not implemented')
class FromObservable extends Observable
constructor: (@array) ->
subscribe: (onNext) ->
@array.forEach onNext
class FilterObservable extends Observable
constructor: (@source, @predicate) ->
subscribe: (onNext) ->
@source.subscribe (x) =>
onNext(x) if @predicate(x)
class MapObservable extends Observable
constructor: (@source, @selector) ->
subscribe: (onNext) ->
@source.subscribe (x) =>
onNext @selector(x)
Observable
.from([1..10])
.filter (x) -> x % 2 is 0
.map (x) -> x * x
.subscribe (x) ->
console.log x
# No Scheduler
# No onError & onCompleted
# No Disposable
class Observable
@from: (array) ->
new FromObservable(array)
filter: (predicate) ->
new FilterObservable(@, predicate)
map: (selector) ->
new MapObservable(@, selector)
subscribe: (observer) ->
throw new Error('Not implemented')
class Observer
constructor: (@_onNext) ->
onNext: ->
@_onNext.apply(@, arguments)
class FromObservable extends Observable
constructor: (@array) ->
subscribe: (observer) ->
@array.forEach observer.onNext.bind(observer)
class FilterObservable extends Observable
class FilterObserver
constructor: (@observer, @predicate) ->
onNext: (x) ->
@observer.onNext(x) if @predicate(x)
constructor: (@source, @predicate) ->
subscribe: (observer) ->
@source.subscribe new FilterObserver(observer, @predicate)
class MapObservable extends Observable
class MapObserver extends Observer
constructor: (@observer, @selector) ->
onNext: (x) ->
@observer.onNext @selector(x)
constructor: (@source, @selector) ->
subscribe: (observer) ->
@source.subscribe new MapObserver(observer, @selector)
Observable
.from([1..10])
.filter (x) -> x % 2 is 0
.map (x) -> x * x
.subscribe new Observer (x) ->
console.log x
@bouzuya
Copy link
Copy Markdown
Author

bouzuya commented Nov 17, 2015

よりチェーンっぽさを伝えるために filter を追加したり、range は引数がわかりづらいので from (本来は iterable をとるが今回は array のみ) にしたり。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment