open Js_of_ocaml let (let=?) : 'a option -> ('a -> unit) -> unit = fun f opt -> Option.iter opt f let post_message : Worker_messages.from_worker -> unit = Worker.post_message let rebuild outline = let path = outline.Outline.path in let=? path = Path.Fixed.rebuild path in let back = Path.Fixed.map path (fun pt -> Path.Point.copy pt @@ Path.Point.get_coord' pt) in let=? back = Path.Fixed.rebuild back in post_message (`Complete {outline with path; back}) let execute (command: Worker_messages.to_worker) = match command with (* Full rebuild, evaluate the whole path *) | `Complete outline -> rebuild outline (* Remove the point from the main line, and reevaluate the whole path *) | `DeletePoint (point, outline) -> let=? path = Path.Fixed.remove_point outline.Outline.path point in rebuild { outline with path } (* Only evaluate the interior *) | `Back outline -> let back = Path.Fixed.map outline.Outline.path (fun pt -> Path.Point.copy pt @@ Path.Point.get_coord' pt) in let=? back = Path.Fixed.rebuild back in post_message (`Complete {outline with back}) | `TranslatePath (outline, delta) -> let path = Path.Fixed.map outline.path (fun pt -> Path.Point.get_coord pt |> Gg.V2.add delta |> Path.Point.copy pt) and back = Path.Fixed.map outline.back (fun pt -> Path.Point.get_coord pt |> Gg.V2.add delta |> Path.Point.copy pt) in post_message (`Complete {outline with path; back}) | `TranslatePoint (point, outline) -> (* I do not use the function Path.Fixed.replace_point here, I just replace the point position and run a full rebuild *) let path = Path.Fixed.map outline.path (fun pt -> match Path.Point.id pt = Path.Point.id point with | true -> point | false -> pt ) in rebuild { outline with path } let () = Worker.set_onmessage execute