-
Notifications
You must be signed in to change notification settings - Fork 0
/
iOHelpers.ml
60 lines (53 loc) · 1.8 KB
/
iOHelpers.ml
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
(* helper function to get a sublist *)
let rec sublist (lst : 'a list) (a : int) (b : int) : 'a list =
if b < a then []
else match lst with
| [] -> []
| h :: t ->
(match (a, b) with
| (0, 0) -> [h]
| (0, _) -> [h] @ sublist t a (b - 1)
| (_, _) -> sublist t (a - 1) (b - 1))
let chunk_list (chunk_sizes : int) (lst : 'a list) =
let rec split_chunk (i : int) (l : 'a list) =
if i = chunk_sizes then
[], l
else
match l with
| h :: t ->
let tchunk, ttail = split_chunk (i + 1) t in
h :: tchunk, ttail
| [] -> [], [] in
let rec aux (sublist : 'a list) =
match split_chunk 0 sublist with
| chunk, [] -> [chunk]
| chunk, t -> chunk :: aux t in
aux lst
(* Drawn from ps5/http_services *)
let page_lines (page : string) : string list =
(* read in all the lines from a file and concatenate them into a big
string *)
let rec input_lines (inchan : in_channel) (lines: string list)
: string list =
try
input_lines inchan ((input_line inchan) :: lines)
with End_of_file -> List.rev lines in
input_lines (open_in page) []
(* following https://ocaml.org/learn/tutorials/file_manipulation.html *)
let write_file (s : string) (fname : string) : unit =
let oc = open_out fname in
Printf.fprintf oc "%s" s;
close_out oc
let write_json (json : Yojson.Basic.json) (fname : string) : unit =
write_file (Yojson.Basic.to_string json) fname
(* following http://www.rosettacode.org/wiki/Execute_a_system_command#OCaml *)
let syscall (s : string) : string =
let ic, oc = Unix.open_process s in
let buf = Buffer.create 16 in
(try
while true do
Buffer.add_channel buf ic 1
done
with End_of_file -> ());
let _ = Unix.close_process (ic, oc) in
(Buffer.contents buf)