[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mirage + froc = self-scaling?

Thanks for your insights.

> What I'd like it to look like:
> ~~~~~~~
> create: unit -> ('a pusher * 'a t)
> write: (\exist 'a . ('a * 'a pusher)) list -> unit (* push several
> values on several primitive signals instantaneously *)
> ~~~~~~~

Actually I was more going towards that kind interface. The thing is that React, 
contrary to Froc doesn't use global data structures, so I was for sure not 
going to have a froc-like interface. The data structure used during and update 
cycle needs to be witnessed somewhere. So the idea was to expose a `step` type 
that represents an update cycle:

  module Step : sig
    type t
    create : unit -> step
    perform : step  -> unit

  val S.create : unit -> 'a signal * (?step:Step.t -> 'a -> unit) 

with the idea that if you use the ~step arguments is schedules the value of the 
primitive to be one provided on this step. This may not be optimal maybe Step 
should be a "Steps", so that you can definitively plugin a Steps structure on 
the primitive setter and forget. 

This could also be an opportunity to build in a mechanism for primitive update 
from the update cycle -- so far I always told people to put the updates in a 
queue and dequeue after the step. In fact if the signal setter function no 
longer automatically create an update cycle that is we change the signal setter 
signature to a concrete Step.t -> 'a -> unit, this becomes trivial. But I need 
to think about what happens with fixed point operators, as those automatically 
create steps. It may also make libraries less compositional (if they impose 
their step). 

Regarding the thread-safety rule [1] I think it would still be rather simple: 
Let uset(s) be the set of events and signals *including the primitive ones* 
that need to be updated whenever `Step.perform s` is invoked. Performing two 
steps s and s' concurrently is only allowed if uset(s) and uset(s') are 
disjoint, otherwise the steps executions must be serialized.

So maybe the idea of react that the setter function automatically creates an 
update cycle was a bad one. Having an explicit steps type to drive the system 
may be better. 

But it's a change I need to get right, so I won't rush. I'm however very 
interested in talking in person with you Raphael (or anybody who has some 
experience or toughts about frp in Cambridge) about this during the following 
two months.



P.S. This becomes a little bit OT for mirage maybe we should try to find 
another venue to discuss these things. Maybe an ocaml-frp mailing list ? 

[1] http://erratique.ch/software/react/doc/React#update



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.