Sha256: ef42d01453c02070211e3d1109242255b404d0c54beea97988900a2f303cc034

Contents?: true

Size: 1.36 KB

Versions: 76

Compression:

Stored size: 1.36 KB

Contents

open Core.Std
open React

let allowed_failures = 9

type progress =
    | Win
    | Lose
    | Busy of int

type t = {
    send_feed : 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

76 entries across 76 versions & 1 rubygems

Version Path
trackler-2.0.6.20 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.19 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.18 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.17 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.16 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.15 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.14 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.13 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.12 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.11 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.10 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.9 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.8 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.7 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.6 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.5 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.4 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.3 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.2 tracks/ocaml/exercises/hangman/example.ml
trackler-2.0.6.1 tracks/ocaml/exercises/hangman/example.ml