syndicate-2017/racket/syndicate/pretty.rkt

43 lines
1.4 KiB
Racket

#lang racket/base
(provide gen:syndicate-pretty-printable
syndicate-pretty-print
syndicate-pretty-print->string
exn->string ;; required from racket/exn
string-indent
indented-port-output)
(require racket/generic)
(require racket/pretty)
(require racket/exn)
(require (only-in racket/string string-join string-split))
(require "trie.rkt")
(define-generics syndicate-pretty-printable
(syndicate-pretty-print syndicate-pretty-printable [port])
#:defaults ([(lambda (x) (and (not (eq? x #f)) (trie? x)))
(define (syndicate-pretty-print m [p (current-output-port)])
(pretty-print-trie m p))]
[(lambda (x) #t)
(define (syndicate-pretty-print v [p (current-output-port)])
(pretty-write v p))]))
(define (syndicate-pretty-print->string v)
(define p (open-output-string))
(syndicate-pretty-print v p)
(get-output-string p))
(define (string-indent amount s)
(define pad (make-string amount #\space))
(string-join (for/list [(line (string-split s "\n"))] (string-append pad line)) "\n"))
(define (indented-port-output amount f #:first-line? [first-line? #t])
(define p (open-output-string))
(f p)
(define fully-indented (string-indent amount (get-output-string p)))
(if first-line?
fully-indented
(substring fully-indented amount)))