File: prod_cons.ml

package info (click to toggle)
obrowser 1.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 3,216 kB
  • ctags: 3,498
  • sloc: ml: 13,505; makefile: 343; sh: 11
file content (47 lines) | stat: -rw-r--r-- 1,171 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
open Js ;;
open Html ;;

let cdiv = get_element_by_id Sys.argv.(1) ;;

let stock = span [] ;;
let on_food_stock =
  let m = Mutex.create () in
    (fun f () ->
       Mutex.lock m ;
       let r = (try f stock with e -> Mutex.unlock m ; raise e) in
	 Mutex.unlock m ; r)
;;

let eater delay =
  let stomach = span [] in
  let rec eater () =
    on_food_stock
      (fun stock ->
	 let avail = Node.children stock in
	   match avail with
	     | [] -> ()
	     | el :: _ -> Node.append stomach el (* automatically deletes from stock (DOM) *)
      ) () ;
    Thread.delay delay ; eater ()
  in ignore (Thread.create eater ()) ; stomach
;;

let resource src =
  a ~onclick:(on_food_stock (fun stock -> Node.append stock (img ~src:src ()))) [img ~src:src ()]
;;

let _ =
  Node.append cdiv (
    div [
      div [string "Feed with " ;
	   resource "food/cherries.png" ; string " " ;
	   resource "food/strawberry.png" ; string " " ;
	   resource "food/lemon.png" ];
      div [string "Stock: " ; stock ] ;
      div [string "Greedy eater: " ; eater 1. ] ;
      div [string "Standard stomach: " ; eater 1.5 ] ;
      div [string "On a diet: " ; eater 2. ] ;
    ]
  )
;;