style address good-taste review suggestions

- Extract strip_trailing_digits helper to replace imperative while loop in language_of_shebang (purely functional now) - Replace Fun.flip Option.bind with idiomatic >>= operator for option chaining in language_of_emacs_prop - Add comment explaining bounded queue behaviour in BFS commit walker - Improve comment on orphan tail page absorption in pagination logic

Commit
e0f55845942f7fd72ed098a5050771a6cbd05cfd
Author
Claude Sonnet 4 <claude@anthropic.invalid>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
lib/handlers.ml
index dc9b8334..a07ed755 100644..100644
@@ -111,7 +111,8 @@
111 111 else List.filteri (fun i _ -> i >= offset) all_commits
112 112 in
113 113 let remaining = List.length after_offset in
114 Removed: (* If next page would have <10 items, absorb them; otherwise normal page *)
114 Added: (* Avoid a final page with fewer than 10 items — absorb them into this
115 Added: page instead, so users don't paginate for a near-empty last page. *)
115 116 let effective_size =
116 117 if remaining > page_size && remaining <= page_size + 10 then remaining
117 118 else page_size
lib/resolvers.ml
index b37e5d11..2217b929 100644..100644
@@ -298,7 +298,10 @@
298 298 of_hash repository hash
299 299
300 300 let recent_matching_from repository hash count predicate =
301 Removed: (* BFS traversal following all parents, ordered by author date descending *)
301 Added: (* BFS traversal following all parents, ordered by author date descending.
302 Added: The queue is kept sorted via List.merge on insertion. This is O(n) per
303 Added: insert, but the queue length is bounded by the branch factor × count,
304 Added: which is small in practice (most commits have 1-2 parents). *)
302 305 let module S = Set.Make (String) in
303 306 let rec walk collected seen queue remaining =
304 307 if remaining <= 0 then Lwt_result.return (List.rev collected)
lib/views/repo.ml
index c5196d8f..0963eee6 100644..100644
@@ -70,17 +70,19 @@
70 70 else base
71 71 in
72 72 (* Strip version suffixes: python3.11 -> python, ruby3.2 -> ruby *)
73 Added: let strip_trailing_digits s =
74 Added: let len = String.length s in
75 Added: let rec find_end i =
76 Added: if i < 0 then s
77 Added: else if s.[i] >= '0' && s.[i] <= '9' then find_end (i - 1)
78 Added: else String.sub s 0 (i + 1)
79 Added: in
80 Added: find_end (len - 1)
81 Added: in
73 82 let interpreter =
74 83 match String.split_on_char '.' interpreter with
75 84 | [] -> ""
76 Removed: | base :: _ ->
77 Removed: (* Also strip trailing digits: python3 -> python *)
78 Removed: let len = String.length base in
79 Removed: let i = ref (len - 1) in
80 Removed: while !i >= 0 && base.[!i] >= '0' && base.[!i] <= '9' do
81 Removed: decr i
82 Removed: done;
83 Removed: if !i < 0 then base else String.sub base 0 (!i + 1)
85 Added: | base :: _ -> strip_trailing_digits base
84 86 in
85 87 match String.lowercase_ascii interpreter with
86 88 | "sh" | "bash" | "dash" | "ash" | "zsh" -> Some "bash"
@@ -158,9 +160,8 @@
158 160 | "makefile" -> Some "makefile"
159 161 | m -> Some m
160 162 in
161 Removed: find_between line "-*-" "-*-"
162 Removed: |> Fun.flip Option.bind extract_mode
163 Removed: |> Fun.flip Option.bind normalize_mode
163 Added: let ( >>= ) = Option.bind in
164 Added: find_between line "-*-" "-*-" >>= extract_mode >>= normalize_mode
164 165
165 166 let language_of_vim_modeline line =
166 167 let contains_substring s sub =