refactor replace mutable refs with folds in prescan and normalize

- prescan.ml scan: List.filter_map instead of ref + List.iter - normalize.ml extract_planning: List.fold_left building a record instead of three refs mutated in List.iter

Commit
22e5e17ed487520b0bf964f0b015e174cd04c66b
Author
Kiro (high) <noreply@kiro.dev>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
lib/normalize.ml
index f21d1d5d..c81fd39c 100644..100644
@@ -469,21 +469,20 @@
469 469
470 470 (** Extract planning information from a list of raw_planning entries. *)
471 471 let extract_planning (entries : Raw_ast.raw_planning list) : Ast.planning option =
472 Removed: if entries = [] then None
473 Removed: else begin
474 Removed: let deadline = ref None in
475 Removed: let scheduled = ref None in
476 Removed: let closed = ref None in
477 Removed: List.iter (fun (entry : Raw_ast.raw_planning) ->
478 Removed: match entry.rpl_keyword with
479 Removed: | "DEADLINE" -> deadline := extract_timestamp entry.rpl_timestamp
480 Removed: | "SCHEDULED" -> scheduled := extract_timestamp entry.rpl_timestamp
481 Removed: | "CLOSED" -> closed := extract_timestamp entry.rpl_timestamp
482 Removed: | _ -> ()
483 Removed: ) entries;
484 Removed: if !deadline = None && !scheduled = None && !closed = None then None
485 Removed: else Some { Ast.deadline = !deadline; scheduled = !scheduled; closed = !closed }
486 Removed: end
472 Added: match entries with
473 Added: | [] -> None
474 Added: | _ ->
475 Added: let planning =
476 Added: List.fold_left (fun acc (entry : Raw_ast.raw_planning) ->
477 Added: match entry.rpl_keyword with
478 Added: | "DEADLINE" -> { acc with Ast.deadline = extract_timestamp entry.rpl_timestamp }
479 Added: | "SCHEDULED" -> { acc with Ast.scheduled = extract_timestamp entry.rpl_timestamp }
480 Added: | "CLOSED" -> { acc with Ast.closed = extract_timestamp entry.rpl_timestamp }
481 Added: | _ -> acc
482 Added: ) { Ast.deadline = None; scheduled = None; closed = None } entries
483 Added: in
484 Added: if planning.deadline = None && planning.scheduled = None && planning.closed = None then None
485 Added: else Some planning
487 486
488 487 (** Extract properties from drawer contents.
489 488 In a PROPERTIES drawer, each entry was parsed as Raw_keyword(name, value). *)
lib/prescan.ml
index 633ec8c2..812f9438 100644..100644
@@ -48,17 +48,15 @@
48 48 Returns a [Config.t] with all discovered TODO sequences. *)
49 49 let scan input =
50 50 let lines = String.split_on_char '\n' input in
51 Removed: let sequences = ref [] in
52 Removed: List.iter
53 Removed: (fun line ->
51 Added: let sequences =
52 Added: List.filter_map (fun line ->
54 53 match extract_keyword_value line with
55 54 | Some (key, value)
56 55 when key = "TODO" || key = "SEQ_TODO" || key = "TYP_TODO" ->
57 Removed: (match parse_todo_value value with
58 Removed: | Some seq -> sequences := seq :: !sequences
59 Removed: | None -> ())
60 Removed: | _ -> ())
61 Removed: lines;
62 Removed: match List.rev !sequences with
56 Added: parse_todo_value value
57 Added: | _ -> None
58 Added: ) lines
59 Added: in
60 Added: match sequences with
63 61 | [] -> Config.default
64 62 | seqs -> { Config.todo_sequences = seqs }