aboutsummaryrefslogtreecommitdiff
path: root/motus/js/state.ml
diff options
context:
space:
mode:
Diffstat (limited to 'motus/js/state.ml')
-rw-r--r--motus/js/state.ml64
1 files changed, 64 insertions, 0 deletions
diff --git a/motus/js/state.ml b/motus/js/state.ml
new file mode 100644
index 0000000..57a3794
--- /dev/null
+++ b/motus/js/state.ml
@@ -0,0 +1,64 @@
+open StdLabels
+open Motus_lib
+
+type letter_validity =
+ | Wellplaced
+ | Misplaced
+ | Missing
+
+type proposition = (Jstr.t * letter_validity) option list
+
+type state =
+ { analysis : Persistence.t
+ ; rules : Criteria.t list
+ ; length : int
+ ; propositions : proposition list
+ ; current_prop : proposition
+ ; fields : Brr.El.t list
+ }
+
+let init () =
+ { analysis = Persistence.empty_data ()
+ ; rules = []
+ ; length = 0
+ ; propositions = []
+ ; current_prop = []
+ ; fields = []
+ }
+
+
+module App = Application.Make (struct
+ type t = state
+end)
+
+(** Get the current rules to apply with from the field list *)
+let get_current_rules : proposition -> Criteria.t list =
+ fun prop ->
+ let rules = ref [] in
+ List.iteri prop ~f:(fun i prop ->
+ Option.iter
+ (fun (letter, validity) ->
+ if Jstr.equal Jstr.empty letter
+ then ()
+ else
+ let char = String.get (Jstr.to_string letter) 0 in
+
+ match validity with
+ | Missing ->
+ rules := Criteria.add (Criteria.NotContain (char, None)) !rules
+ | Misplaced ->
+ rules :=
+ Criteria.add (Criteria.NotContain (char, Some i)) !rules;
+ rules := Criteria.add (Criteria.Contain (char, None)) !rules
+ | Wellplaced ->
+ rules := Criteria.add (Criteria.Contain (char, Some i)) !rules
+ )
+ prop );
+ List.rev !rules
+
+
+(** Compare two states *)
+let eq : state -> state -> bool =
+ fun s1 s2 ->
+ (s1.length, s1.rules, s1.current_prop, s1.propositions, s1.analysis)
+ = (s2.length, s2.rules, s2.current_prop, s2.propositions, s2.analysis)