redux-pixies
Version:
The magical asynchronous Redux library
62 lines (55 loc) • 1.52 kB
Flow
// @flow
import { tamePixie } from '../enhancers/tamePixie.js'
import type {
PixieInstance,
TamePixie,
TamePixieInput,
WildPixie
} from '../types.js'
/**
* Combines one or more pixies into one.
*/
export function combinePixies<P>(pixieMap: {
[id: string]: WildPixie<P>
}): TamePixie<P> {
const defaultOutput = {}
for (const id of Object.keys(pixieMap)) {
defaultOutput[id] = pixieMap[id].defaultOutput
}
function outPixie(input: TamePixieInput) {
const { onError } = input
const childInputs: { [id: string]: TamePixieInput } = {}
const instances: { [id: string]: PixieInstance<P> } = {}
let outputs: { [id: string]: any } = { ...defaultOutput }
let destroyed: boolean = false
for (const id of Object.keys(pixieMap)) {
const onOutput = (data: any) => {
if (data !== outputs[id]) {
outputs = { ...outputs }
outputs[id] = data
input.onOutput(outputs)
}
}
childInputs[id] = { onError, onOutput }
instances[id] = tamePixie(pixieMap[id])(childInputs[id])
if (destroyed) break
}
return {
update(props: P) {
for (const id of Object.keys(instances)) {
instances[id].update(props)
if (destroyed) return
}
},
destroy() {
destroyed = true
for (const id of Object.keys(instances)) {
instances[id].destroy()
}
}
}
}
outPixie.tame = true
outPixie.defaultOutput = defaultOutput
return outPixie
}