let decoder (fields : [> field ] list) =
  { Parser.f = fun i s fail succ ->
    let rec catch garbage acc = function
      | `Trace (trace, received) :: r ->
        catch garbage ({ trace; received; } :: acc) r
      | field :: r ->
        catch (field :: garbage) acc r
      | [] -> acc, List.rev garbage (* keep the order *)
    in
    succ i s (catch [] [] fields) }