1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
open Core
module S = Set.Make (String)
type t = S.t
let default_words =
[
"A";
"I";
"HELLO";
"WORLD";
"TEST";
"AI";
"HI";
"CODE";
"DOG";
"CAT";
"READ";
"WRITE";
"GAME";
"WORD";
"PLAY";
]
let load_from_file path =
In_channel.read_lines path
|> List.fold ~init:S.empty ~f:(fun acc line ->
let word = String.uppercase (String.strip line) in
if String.is_empty word then acc else Set.add acc word)
let load_default () =
List.fold default_words ~init:S.empty ~f:(fun acc w -> Set.add acc w)
let load ?path () =
match path with
| Some p when Sys_unix.is_file_exn p -> load_from_file p
| _ -> load_default ()
let is_valid ?dict word =
let dict = Option.value dict ~default:(load_default ()) in
Set.mem dict (String.uppercase word)