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)