pub fn write_with_header<T, E, Output, Header, Body>(
    writer: &mut Output,
    header: Header,
    body: Body
) -> Result<T, E> where
    Output: RawOutput<E>,
    Header: FnOnce(&mut Output, u64) -> Result<(), E>,
    Body: FnOnce(&mut Output) -> Result<T, E>,