Created
January 25, 2019 18:20
-
-
Save dralletje/c4674485dd9f916db8217ee2e85175bd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import React from 'react'; | |
| import immutagen from 'immutagen'; | |
| export let generator_render = (generator_fn) => { | |
| let { Provider, Consumer } = React.createContext(); | |
| let render_subchild = (generator, value) => { | |
| let { value: element, next: next_generator } = generator(value); | |
| return <Provider value={{ generator: next_generator }}>{element}</Provider>; | |
| }; | |
| function render() { | |
| let element_this = this || { | |
| get props() { | |
| throw new Error(`Trying to get this.props, but this render function is not bound to a react component :O`); | |
| }, | |
| get state() { | |
| throw new Error(`Trying to get this.state, but this render function is not bound to a react component :O`); | |
| } | |
| }; | |
| let bound_generator_fn = (...args) => generator_fn.call(element_this, ...args); | |
| let immutable_generator = immutagen(bound_generator_fn); | |
| let resolve = (value) => { | |
| return ( | |
| <Consumer> | |
| {({ generator }) => render_subchild(generator, value)} | |
| </Consumer> | |
| ); | |
| }; | |
| return render_subchild(immutable_generator, resolve); | |
| }; | |
| return render; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment