Sha256: 086035ac35fd0c8d6af5b94bda881a0c9574102db4308b12c20c8239a61a875a

Contents?: true

Size: 1.37 KB

Versions: 151

Compression:

Stored size: 1.37 KB

Contents

open Core
open React

let allowed_failures = 9

type progress =
    | Win
    | Lose
    | Busy of int

type t = {
    send_feed : ?step:React.step -> char -> unit;
    masked_word_s : string signal;
    progress_s : progress signal;
}

let feed c { send_feed; _ } = send_feed c
let masked_word { masked_word_s; _ } = masked_word_s
let progress { progress_s; _ } = progress_s

let calc_failures target tried =
    let rec go fails target' = function
        | h :: t when Char.Set.mem target' h ->
            go fails (Char.Set.remove target' h) t
        | _ :: t -> go (fails+1) target' t
        | [] -> fails
    in go 0 target tried

let mask_word word tried =
    let tried' = Char.Set.of_list tried in
    String.map ~f:(function c when Set.mem tried' c -> c | _ -> '_') word

let calc_progress masked_word failures =
    if failures > allowed_failures then
        Lose
    else if not (String.mem masked_word '_') then
        Win
    else
        Busy (allowed_failures - failures)

let create word =
    let target = String.to_list word |> Char.Set.of_list in
    let feed_e, send_feed = E.create () in
    let tried_s = S.fold (fun t h -> h :: t) [] feed_e in
    let failures_s = S.map (calc_failures target) tried_s in
    let masked_word_s = S.map (mask_word word) tried_s in
    let progress_s = S.l2 calc_progress masked_word_s failures_s in
    { send_feed; masked_word_s; progress_s }

Version data entries

151 entries across 151 versions & 1 rubygems

Version Path
trackler-2.2.1.10 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.9 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.8 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.7 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.6 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.5 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.4 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.3 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.2 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.1 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.1.0 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.6 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.5 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.4 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.3 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.2 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.1 tracks/ocaml/exercises/hangman/example.ml
trackler-2.2.0.0 tracks/ocaml/exercises/hangman/example.ml
trackler-2.1.0.55 tracks/ocaml/exercises/hangman/example.ml
trackler-2.1.0.54 tracks/ocaml/exercises/hangman/example.ml