let npartition_exn ~eq l =
let insertl ll a =
let rec loop prefix ll =
match ll with
| [] -> rev ([a]::prefix)
| l::ll ->
if eq a (hd_exn l)
then (rev ((a::l)::prefix)) @ ll
else loop (l::prefix) ll
in loop [] ll
in
map ~f:rev (fold_left ~f:insertl ~init:[] l)