/src/graph/main.ml

http://github.com/hhughes/ocaml-frui · OCaml · 110 lines · 89 code · 17 blank · 4 comment · 7 complexity · 4694d5417a27347a7f2a146fcacdedd5 MD5 · raw file

  1. open JQuery
  2. open Json
  3. open Fvar
  4. let main_elt = Dom.document#getElementById "main"
  5. let gdp_data = Hashtbl.create 50
  6. let gdp_vars = Hashtbl.create 240
  7. let gdp_max = ref 0.
  8. let life_data = Hashtbl.create 50
  9. let life_vars = Hashtbl.create 240
  10. let life_max = ref 0.
  11. let min_year = ref 2000
  12. let max_year = ref 2000
  13. let time = new fvar 2000.
  14. let ids = ref []
  15. let load_datum ht max d =
  16. let year = int_of_string (Datum.date d) in
  17. let country = Item.id (Datum.country d) in
  18. let value = try float_of_string (Datum.value d) with _ -> nan in
  19. if not (Hashtbl.mem ht year) then Hashtbl.add ht year [];
  20. let tl = Hashtbl.find ht year in
  21. if(year < !min_year) then min_year := year;
  22. if(year > !max_year) then max_year := year;
  23. begin
  24. match classify_float value with
  25. | FP_normal -> if(value > !max) then max := value else ()
  26. | _ -> ()
  27. end;
  28. Hashtbl.replace ht year ((country,value)::tl)
  29. let load_var ht (id, value) = Hashtbl.replace ht id (new fvar value)
  30. let position_div (elt : Dom.element) x_max y_max x y =
  31. let w = float_of_int (main_elt#_get_offsetWidth) in
  32. let h = float_of_int (main_elt#_get_offsetHeight) in
  33. let l = (x *. w) /. x_max in
  34. let t = h -. ((y *. h) /. y_max) in
  35. elt#_get_style#_set_left (string_of_int (int_of_float l));
  36. elt#_get_style#_set_top (string_of_int (int_of_float t))
  37. let create_div id =
  38. let elt = Dom.document#createElement "div" in
  39. elt#_set_className "datum";
  40. elt#_set_title id;
  41. let x_axis = Hashtbl.find gdp_vars id in
  42. let y_axis = Hashtbl.find life_vars id in
  43. (* let foo = !gdp_max in
  44. Logger.debug (string_of_float foo);
  45. Logger.debug (Printf.sprintf "gdp_max: %f, life_max: %f" !gdp_max !life_max);*)
  46. ignore (Froc.lift2 (position_div elt !gdp_max !life_max) x_axis#b y_axis#b);
  47. ignore (main_elt#appendChild elt)
  48. let update_axis ht_d ht_v y =
  49. let update (id,v) =
  50. let var = Hashtbl.find ht_v id in
  51. var#set v
  52. in
  53. List.iter update (Hashtbl.find ht_d (int_of_float y))
  54. (* HACK *)
  55. let to_load = ref 99
  56. let loaded () =
  57. if !to_load > 0 then to_load := !to_load - 1
  58. else List.iter create_div !ids
  59. let load_objects ht_d ht_v max o s =
  60. match s with
  61. | "success" ->
  62. begin
  63. let data = js_to_list (unmarshall_json o) in (* expensive!? *)
  64. let data = js_to_list (List.hd data) in
  65. List.iter (load_datum ht_d max) data;
  66. List.iter (load_var ht_v) (Hashtbl.find ht_d 2009);
  67. ids := [];
  68. List.iter (fun (id,_) -> ids := id :: !ids) (Hashtbl.find ht_d 2009);
  69. ignore(Froc.lift (update_axis ht_d ht_v) time#b);
  70. loaded ()
  71. end
  72. | _ -> Logger.debug s
  73. let rec get_n u d v m = function
  74. | 0 -> ()
  75. | n ->
  76. let url = Printf.sprintf u n in
  77. Logger.debug url;
  78. ignore (jQuery_util#get url () (load_objects d v m));
  79. get_n u d v m (n-1)
  80. let load_json _ =
  81. let n_input = (Dom.document#getElementById "n" : Dom.input) in
  82. let n = int_of_string (n_input#_get_value) + 1 in
  83. to_load := (2 * n) - 1;
  84. get_n "http://localhost:8080/gdp/gdp-%d.json" gdp_data gdp_vars gdp_max n;
  85. get_n "http://localhost:8080/life/life-%d.json" life_data life_vars life_max n;
  86. true
  87. let onload () =
  88. let load_button = Dom.document#getElementById "load" in
  89. load_button#_set_onclick (load_json);
  90. let spinner_div = Dom.document#getElementById "spinner" in
  91. Spinner.create spinner_div time 1.
  92. ;;
  93. Dom.window#_set_onload onload