Skip to content

Instantly share code, notes, and snippets.

@siassaj
Created December 12, 2018 09:22
Show Gist options
  • Select an option

  • Save siassaj/5f22ead6e2012e035d5c94b2a2b1c9d7 to your computer and use it in GitHub Desktop.

Select an option

Save siassaj/5f22ead6e2012e035d5c94b2a2b1c9d7 to your computer and use it in GitHub Desktop.
export function mix<
COMB extends {
[CS in keyof ComponentSinks]?: (arg: {
[K in keyof COMPONENTS]: Stream<any>
}) => ComponentSinks[CS]
},
COMPONENTS extends {
[COMPNAME in keyof COMPONENTS]: {
[SINKNAME in keyof ComponentSinks]?: (COMB[SINKNAME] extends (arg: infer STREAMS) => any ? (
COMPNAME extends keyof STREAMS ? STREAMS[COMPNAME] : ComponentSinks[SINKNAME]
)
:
ComponentSinks[SINKNAME])
}
},
>
(componentSinks: COMPONENTS, combines?: COMB): Partial<ComponentSinks>{
// Get all unique keys present in the array of sinks
const keys = _.flow([
_.values,
o => _.map(o, _.keys),
_.flatten,
_.uniq
])(componentSinks)
// array of arrays containing key & mixed sinks, or each key
const arrys = _.map(keys, key => {
// get object of sinks for the key containing undefineds in the right places
const streams = _.flow([
sinks => _.map(sinks, (sink, component) => [component, sink[key]]),
_.fromPairs
])(componentSinks)
const mixed$ = doCombine(combines, key, streams)
const memoryMixed$ = key == "Layout" ?
mixed$.remember()
:
mixed$
return [key, mixed$]
})
// Create an object with keys as keys and values as merged streams
return _.fromPairs(arrys)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment