-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
56 lines (49 loc) · 1.38 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const mitt = require('mitt')
const Events = mitt.default ? mitt.default : mitt
const xs = require('xstream').default
module.exports = function createEffectsDriver (simulate) {
return (effects$) => {
const emitter = new Events()
const subscription = effects$.subscribe({
next: function ({ run, ...config }) {
const args = config.args || []
const mock = typeof simulate === 'object' && (simulate[config.tag] || simulate[run.name]);
(mock || run)(...args)
.then(value => emitter.emit(config.tag, { value, error: null }))
.catch(error => emitter.emit(config.tag, { value: null, error }))
},
complete: function () {
subscription.unsubscribe()
}
})
function select (tag = '*') {
let sub
return xs.create({
start: function (listener) {
sub = e => {
listener.next(e)
}
emitter.on(tag, sub)
},
stop: function () {
emitter.off(tag, sub)
}
})
}
function selectValue (tag) {
return select(tag)
.filter(({ error }) => error === null)
.map(({ value }) => value)
}
function selectError (tag) {
return select(tag)
.filter(({ error }) => error !== null)
.map(({ error }) => error)
}
return {
select,
selectValue,
selectError
}
}
}