Be more lazy and slack off

This commit is contained in:
Vivianne 2024-03-04 09:38:48 -05:00
parent fcc0f4b263
commit e3c9ed9d8f

View file

@ -15,14 +15,19 @@
;; TODO: the golang uniseg also does word and sentence boundaries. These state machines could be implemented if we wanted to. ;; TODO: the golang uniseg also does word and sentence boundaries. These state machines could be implemented if we wanted to.
(define-immutable-record-type <grapheme> (define-immutable-record-type <grapheme>
(make-grapheme glyphs width) (make-grapheme width glyphs-promise string-promise)
grapheme? grapheme?
(glyphs grapheme-glyphs) (width grapheme-width)
(width grapheme-width)) (glyphs-promise _grapheme-glyphs-promise)
(string-promise _grapheme-string-promise))
(define (grapheme-glyphs grapheme)
"Return a lazily-constructed list of glyphs in the grapheme"
(force (_grapheme-glyphs-promise grapheme)))
(define (grapheme-string grapheme) (define (grapheme-string grapheme)
"Given a grapheme, construct a string representing it." "Return a lazily-constructed string of the glyphs in the grapheme."
(list->string (grapheme-glyphs grapheme))) (force (_grapheme-string-promise grapheme)))
(define (string->grapheme-stream str) (define (string->grapheme-stream str)
"Given a string, create a (lazy) stream of graphemes." "Given a string, create a (lazy) stream of graphemes."
@ -117,8 +122,8 @@
(else (values 'any #t)))) (else (values 'any #t))))
(define grapheme-width 0)
(define glyphs-reverse '()) (define glyphs-reverse '())
(define grapheme-width 0)
(define hit-eof #f) (define hit-eof #f)
@ -147,6 +152,8 @@
stream-null stream-null
(stream-cons (stream-cons
(make-grapheme (make-grapheme
(reverse glyphs-reverse) grapheme-width
grapheme-width) ;; Delay to avoid construction of unnecessary lists and strings!
(delay (reverse-list->string glyphs-reverse))
(delay (reverse glyphs-reverse)))
(input->grapheme-stream port)))) (input->grapheme-stream port))))