[OCaml] Org mode parser.
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
Changed files
lib/normalize.ml
@@ -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
@@ -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 }