package react const testVersion = 4 /* reactor */ type reactor struct { cells []compuCell // XXX } func New() Reactor { return &reactor{} } func (r *reactor) CreateCompute1(c Cell, f func(int) int) ComputeCell { return &compuCell{ eval: func() int { return f(c.Value()) }, cb: make(map[CallbackHandle]func(int)), } } func (r *reactor) CreateCompute2(c1, c2 Cell, f func(int, int) int) ComputeCell { return &compuCell{ eval: func() int { return f(c1.Value(), c2.Value()) }, cb: make(map[CallbackHandle]func(int)), } } func (r *reactor) CreateInput(i int) InputCell { return &inputCell{ value: i, reactor: r, // XXX } } /* input cell */ type inputCell struct { value int *reactor } func (c *inputCell) SetValue(i int) { // TODO trigger call back if c.value != i { c.value = i } } func (c *inputCell) Value() int { return c.value } /* compute cell */ type compuCell struct { eval func() int cb map[CallbackHandle]func(int) } func (c *compuCell) AddCallback(f func(int)) CallbackHandle { c.cb[&f] = f return &f } func (c *compuCell) RemoveCallback(h CallbackHandle) { delete(c.cb, h) } func (c *compuCell) Value() int { return c.eval() }