syndicate-2017/racket/syndicate/drivers/line-reader.rkt

22 lines
755 B
Racket
Raw Normal View History

#lang syndicate
2016-07-26 01:30:14 +00:00
(provide (struct-out tcp-channel-line))
(require "tcp.rkt")
2017-10-11 21:22:29 +00:00
(require "../support/bytes.rkt")
2016-07-26 01:30:14 +00:00
(struct tcp-channel-line (source destination bytes) #:prefab)
2017-08-05 23:37:34 +00:00
(spawn #:name 'line-reader-factory
(during/spawn (observe (tcp-channel-line $src $dst _))
#:name `(line-reader ,src ,dst)
(field [buffer #""])
(on (message (tcp-channel src dst $bs))
(buffer (bytes-append (buffer) bs)))
(begin/dataflow
(define newline-pos (bytes-index (buffer) (char->integer #\newline)))
(when newline-pos
(define line (subbytes (buffer) 0 newline-pos))
(buffer (subbytes (buffer) (+ newline-pos 1)))
(send! (tcp-channel-line src dst line))))))