(define functionU (require-library-unit/sig "functior.ss"))
(define prettyU (require-library-unit/sig "prettyr.ss"))

(define-signature htmlS
  (write-str-to-file strlist-to-str filename-from-symbol filename-from-string enclose-in-tag))

(define HtmlU
  (unit/sig htmlS
    (import mzlib:function^ mzlib:pretty-print^)

    (define (filename-from-symbol sym)
      (string-append (symbol->string sym) ".html"))

    (define (strlist-to-str slst)
      (apply string-append slst))
    
    (define (enclose-in-tag tag str . attr)
      (if (null? attr)
          (format "<~a>~a</~a>
          " tag str tag)
          (format "<~a ~a>~a</~a>
          " tag (car attr) str tag)))
    
    (define (write-str-to-file str filename)
      (let ([port (open-output-file filename 'replace)])
        (pretty-display str port)
        (close-output-port port)))

    (define (char-converter c)
      (if (char=? c #\space) #\- c))

    (define (spaces/dashes s)
      (list->string (map char-converter (string->list s))))

    (define (filename-from-string str)
      (string-append (spaces/dashes str) ".html"))
    ))

(define lab3U
  (compound-unit/sig
    (import (PLT : plt:userspace^))
    (link
     (FUNCTION : mzlib:function^ (functionU))
     (PRETTY : mzlib:pretty-print^ (prettyU))
     (HTML : htmlS (HtmlU FUNCTION PRETTY)))
    (export (open HTML)))) 

lab3U
