/froclist/froclist.ml

http://github.com/hhughes/ocaml-frui · OCaml · 44 lines · 32 code · 11 blank · 1 comment · 4 complexity · 3039195558080dd4ee344fbf92f9adbd MD5 · raw file

  1. open Froc
  2. open Printf
  3. let (>>=) = Froc.(>>=)
  4. (* assert list is always in *time* order *)
  5. let counte,counts = Froc.make_event ()
  6. let count = Froc.hold 0 counte
  7. let inc n = fun c -> return (c + n)
  8. let liste,lists = Froc.make_event ()
  9. let list = Froc.hold [(count >>= inc 2); (count >>= inc 1); (count >>= inc 0)] liste
  10. let rec leq l1 l2 =
  11. match (l1, l2) with
  12. | [], [] -> true
  13. | [], _
  14. | _, [] -> false
  15. | x::xs, y::ys -> sample x = sample y & (leq xs ys)
  16. let rec lnew lo ln =
  17. match (lo, ln) with
  18. | [], _
  19. | _, []
  20. | [], [] -> []
  21. | x::xs, y::ys ->
  22. if sample x = sample y then []
  23. else y :: (lnew lo ys)
  24. let rec lbind l f =
  25. let s = sample l in
  26. List.iter (fun x -> ignore (x >>= f)) s;
  27. l >>= (fun x ->
  28. if leq s x then return ()
  29. else lbind (return (lnew s x)) f
  30. );;
  31. ignore (lbind list (fun i -> printf "item %d\n" i; return ()));;
  32. ignore (send lists [(count >>= inc 4); (count >>= inc 3); (count >>= inc 2); (count >>= inc 1); (count >>= inc 0)]);;
  33. ignore (Froc.send counts ((Froc.sample count) + 1));;