struct
  open Encoder
  let rec w_lst w_sep w_data l =
    let open Wrap in
      let rec aux = function
      | [] -> noop
      | [ x ] -> w_data x
      | x :: r -> w_data x $ w_sep $ aux r
    in aux l
  let w_crlf k e = string "\r\n" k e
  let w_field = function
    | `ResentCc l ->
      string "Resent-Cc: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ Address.Encoder.w_addresses l $ close_box) (unlift k))))
      $ w_crlf
    | `ResentMessageID m ->
      string "Resent-Message-ID: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ MsgID.Encoder.w_msg_id m $ close_box) (unlift k))))
      $ w_crlf
    | `ResentSender p ->
      string "Resent-Sender: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ Address.Encoder.w_mailbox p $ close_box) (unlift k))))
      $ w_crlf
    | `ResentBcc l ->
      string "Resent-Bcc: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ Address.Encoder.w_addresses l $ close_box) (unlift k))))
      $ w_crlf
    | `ResentFrom l ->
      string "Resent-From: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ w_lst (string "," $ space) Address.Encoder.w_mailbox l $ close_box) (unlift k))))
      $ w_crlf
    | `ResentReplyTo l ->
      string "Resent-Reply-To: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ Address.Encoder.w_addresses l $ close_box) (unlift k))))
      $ w_crlf
    | `ResentDate d ->
      string "Resent-Date: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ Date.Encoder.w_date d $ close_box) (unlift k))))
      $ w_crlf
    | `ResentTo l ->
      string "Resent-To: "
      $ (fun k -> Wrap.(lift ((hovbox 0 $ Address.Encoder.w_addresses l $ close_box) (unlift k))))
      $ w_crlf
  let w_resent { date; from; sender; to'; cc; bcc; msg_id; reply_to; } =
    (match date with Some v -> w_field (`ResentDate v) | None -> noop)
    $ (match from with [] -> noop | v -> w_field (`ResentFrom v))
    $ (match sender with Some v -> w_field (`ResentSender v) | None -> noop)
    $ (match to' with [] -> noop | v -> w_field (`ResentTo v))
    $ (match cc with [] -> noop | v -> w_field (`ResentCc v))
    $ (match bcc with [] -> noop | v -> w_field (`ResentBcc v))
    $ (match msg_id with Some v -> w_field (`ResentMessageID v) | None -> noop)
    $ (match reply_to with [] -> noop | v -> w_field (`ResentReplyTo v))
end