#lang scheme/base
(require "depend.ss"
)
(define (read-folded-line in (convert identity))
(define (folding? c)
(or (equal? c #\space)
(equal? c #\tab)))
(define (return lines)
(apply string-append "" (reverse lines)))
(define (convert-folding lines)
(let ((c (peek-char in)))
(cond ((folding? c)
(read-char in)
(convert-folding lines))
(else
(helper lines)))))
(define (helper lines)
(let ((l (read-line in (line-term))))
(cond ((eof-object? l)
(return lines))
((string=? l "")
(return (cons l lines)))
(else
(let ((c (peek-char in)))
(if (folding? c)
(helper (cons (convert l) lines))
(return (cons (convert l) lines))))))))
(helper '()))
(define (folded-line->string s (convert identity))
(read-folded-line (open-input-string s) convert))
(provide/contract
(read-folded-line (->* (input-port?)
((-> any/c any))
string?))
(folded-line->string (->* (string?)
((-> any/c any))
string?))
)