csv-writer.rkt
#lang racket

(provide make-csv-writer)

(define (make-csv-writer
         #:delimiter [ delimiter "\t" ]
         #:lineterminator [ lineterminator "\n" ]
         ;; the following are not yet implemented
         #:escapechar [ escapechar "\\" ] 
         #:doublequote [ doublequote #t ]
         #:quotechar [ quotechar "\"" ]
         #:quoting [ quoting #t ]
         #:skipinitialspace [ skipinitialspace #t ]
         #:strict [ strict #t ] )
  
  ; I take a list of elements, and join them after passing
  ; through element-flatten,
  (define (slist->string data element-flatten separator)
    (string-join (map element-flatten data) separator))
  ; Flatten row flattens a list of records and joins them
  (define (flatten-row row)
    (slist->string row (λ(x) x) delimiter))
  ; Final flattening step
  (define (flatten-list-of-rows list-of-rows)
    (slist->string list-of-rows flatten-row lineterminator))
  
  flatten-list-of-rows)