anchor.diff:    let joinWith bop xs =
       match Seq.revAppendToList xs [] with
        | [] -> empty
  -     | x::xs -> List.fold (fun r x -> bop x r) x xs
  +     | x::xs -> List.fold (flip bop) x xs
     let catWith bop xs = joinWith bop xs // XXX obsolete
     let joinSep sep xs = joinWith (fun l r -> l <^> (sep <^> r)) xs
     let hsep xs = joinWith (<+>) xs
  
positive.code:       doc
  
    let outputToWriter (tw: TextWriter) maxCols doc =
      outputWithFun (fun s -> tw.Write s) maxCols doc
  
    let render maxCols doc =
      use tw = new StringWriter ()
  
negative.code:          layout (force doc)
  
      let fits usedCols doc =
        match maxCols with
         | None -> true
         | Some maxCols ->
           let rec lp usedCols doc =
             usedCols <= maxCols &&
             match force doc with
              | NIL | LINEFEED _ -> true
              | OBJ (_, doc) -> lp usedCols doc
              | PRINT (str, doc) -> lp (usedCols + String.length str) doc
           lp usedCols (lazy doc)
  
      let rec best usedCols = function
        | [] -> NIL
  