diff options
| author | DJ O'Leary <dijitol@proton.me> | 2025-12-11 03:53:58 +0100 |
|---|---|---|
| committer | DJ O'Leary <dijitol@proton.me> | 2025-12-11 03:53:58 +0100 |
| commit | f4930be59d15c42fdd9b25a354a123de1e8c7fe3 (patch) | |
| tree | a6fc42d6fac6d014ea7dd88f11db9d6f64e49de4 | |
| parent | a7c59b1dba9bc54d1283a8d242e95984b0a8e791 (diff) | |
feat(parser): add parser module
| -rw-r--r-- | 2025/ocaml/lib/application/parser.ml | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/2025/ocaml/lib/application/parser.ml b/2025/ocaml/lib/application/parser.ml new file mode 100644 index 0000000..099900b --- /dev/null +++ b/2025/ocaml/lib/application/parser.ml @@ -0,0 +1,36 @@ +(** [rows_of_string s] is a list of strings where each element is a row of [s]. *) +let rows_of_string s = + s |> String.split_on_char '\n' + |> List.filter_map (fun l -> + let trimmed = String.trim l in + if trimmed <> "" then Some trimmed else None ) + +(** [columns_of_string ?sep s] is a list of strings where each element is + a column of [s] where each column is separated by [sep]. *) +let rec columns_of_string ?(sep = ' ') s = + rows_of_string s + |> List.map (fun l -> + l |> String.split_on_char sep |> List.filter (fun l -> l <> "") ) + |> transpose + +(** [group_columns lst] is a list where the first element of each + sublist of [lst] is grouped in [acc] and so on for the rest of the elements. + Example: [group_columns [] \[\["abc"; "def"\]; \["ghi"; "jkl"\]\]] is the list [\[\["abc";"ghi"\];\["def";"jkl"\]\]]. *) +and transpose lst = + assert (lst <> []) ; + if List.mem [] lst then [] + else List.map List.hd lst :: transpose (List.map List.tl lst) + +let%expect_test "rows correctly parsed" = + let have = {| abc def + ghi jkl |} in + let rows = rows_of_string have in + List.iter (fun c -> print_string (c ^ " ")) rows ; + [%expect {| abc def ghi jkl |}] + +let%expect_test "columns correctly parsed" = + let have = {| abc def + ghi jkl |} in + let cols = columns_of_string have in + List.iter (fun row -> List.iter (fun c -> print_string (c ^ " ")) row) cols ; + [%expect {| abc ghi def jkl |}] |
