Skip to content

Instantly share code, notes, and snippets.

@skokenes
Last active August 10, 2018 21:01
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 skokenes/3e1159ac39c607a688e82081fc98ddc6 to your computer and use it in GitHub Desktop.
Save skokenes/3e1159ac39c607a688e82081fc98ddc6 to your computer and use it in GitHub Desktop.
model$ for recompose + rxjs
function createModel(propsConfig = {}, sideEffects = []) {
const entries = Object.entries(propsConfig);
const props$ = combineLatest(...entries.map(entry => entry[1])).pipe(
map(values =>
values.reduce((props, currValue, currIndex) => {
const propName = entries[currIndex][0];
return {
...props,
[propName]: currValue
};
}, {})
)
);
const ignoredSideEffects$ = merge(...sideEffects).pipe(ignoreElements());
return merge(props$, ignoredSideEffects$);
}
// usage
componentFromStream(props$ => {
// ... some observables
const model$ = createModel({
isSearching: isSearching$,
containerClass: props$.pipe(
map(props => props.containerClass),
distinctUntilChanged()
)
}, [/* side effect observables here */]);
const Component = props => (
<div>
<Searchbox
containerClass={props.containerClass}
/>
{props.isSearching ? <div>searching!</div> : null}
</div>
);
return model$.pipe(map(Component));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment