From 741f88ab405995003eb6e9f301d3b065c1e84a4a Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Fri, 28 Jan 2022 14:44:57 +0100 Subject: Added a motus solver --- motus/js/state.ml | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 motus/js/state.ml (limited to 'motus/js/state.ml') 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) -- cgit v1.2.3