Skip to content

Instantly share code, notes, and snippets.

@CreaturePhil
Created March 8, 2017 04:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CreaturePhil/dd7565a7765389ef1bd739fe5929db6e to your computer and use it in GitHub Desktop.
Save CreaturePhil/dd7565a7765389ef1bd739fe5929db6e to your computer and use it in GitHub Desktop.
const Observable = subscribe =>
({
subscribe,
map: f =>
Observable(observer =>
subscribe({next: x => observer.next(f(x))})
),
filter: f =>
Observable(observer =>
subscribe({next: x => f(x) ? observer.next(x) : null})
),
reduce(f, seed) {
let self = this;
return Observable(observer =>
subscribe({
next(x) {
const result = self.acc !== undefined ? f(self.acc, x) : f(seed, x)
self.acc = result
observer.next(result)
}
})
)
},
take(amount) {
let self = this;
self.taken = 0;
return Observable(observer =>
subscribe({
next(x) {
self.taken < amount ? observer.next(x) : null
self.taken++
}
})
)
},
do: f =>
Observable(observer =>
subscribe({
next(x) {
f(x)
observer.next(x)
}
})
),
flatten: () =>
Observable(observer =>
subscribe({
next: observable =>
observable.subscribe({
next(x) {
observer.next(x)
}
})
})
)
})
const periodic = period =>
Observable(observer => {
let i = 0
setInterval(() => observer.next(i++), period)
})
//
// periodic(1000)
// .map(x => x + 1)
// .filter(x => x % 2 == 0)
// .do(x => console.log('n: ', x))
// .reduce((acc, x) => acc + x, 0)
// .take(5)
// .subscribe({
// next(x) {
// console.log('total: ', x)
// }
// })
periodic(1000)
.map(x => periodic(1000))
.flatten()
.subscribe({
next(x) {
console.log('flat: ', x)
}
})
//
// periodic(1000)
// .map(x => x + 1)
// .filter(x => x % 2 !== 0)
// .reduce((acc, x) => acc + x, 0)
// .subscribe({
// next(x) {
// console.log(x)
// }
// })
// periodic(1000)
// .take(5)
// .subscribe({
// next(x) {
// console.log(x)
// }
// })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment