import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { Model, Observable, Store, createContainer } from "gasoline"; import './index.css'; const counter = new Model({ state: { counter: 0, running: true, interval: 1000 }, actions: { toggle(state) { return { ...state, running: !state.running } }, increment(state) { return { ...state, counter: state.counter + 1 } }, decrement(state) { return { ...state, counter: state.counter - 1 } }, reset(state) { return { ...state, counter: 0 } }, changeInterval(state, interval) { return { ...state, interval, counter: 0 } } }, process(action$, counter) { const autoIncrement$ = action$.ofType( Store.START, counter.actionTypes.toggle, counter.actionTypes.changeInterval, counter.actionTypes.reset ).switchMap(() => { const state = counter.state if (state.running) { return Observable .interval(state.interval) .map(counter.actionCreators.increment) } return Observable.empty() }) return autoIncrement$ } }) const store = new Store(counter); type CounterProps = { running: boolean, counter: number, interval: number, onIntervalChange: React.ChangeEventHandler, onResetClick: React.MouseEventHandler, onToggleClick: React.MouseEventHandler, onIncrementClick: React.MouseEventHandler, onDecrementClick: React.MouseEventHandler } function Counter(props: CounterProps) { return (
Counter: {props.counter}

   

 
) } const CounterContainer = createContainer(() => { const { actions, state$ } = counter function onIntervalChange(e: React.ChangeEvent) { actions.changeInterval(Number(e.target.value)) } return state$.map(state => ) }) store.ready(() => { ReactDOM.render( , document.querySelector("#app") ) }) store.start()