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) }