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