Something like this:
(defclass mailbox-input-stream (stream:fundamental-character-input-stream)
((mailbox :initarg :mailbox
:accessor mailbox-stream-mailbox
:initform nil)))
(defmethod stream-element-type ((stream mailbox-input-stream))
'character)
(defmethod stream:stream-read-char ((stream mailbox-input-stream))
(let ((char (mp:mailbox-read (mailbox-stream-mailbox stream))))
(if (eql char #\Line-Separator)
#\Newline
char)))
(defclass mailbox-output-stream (stream:fundamental-character-output-stream)
((mailbox :initarg :mailbox
:accessor mailbox-stream-mailbox
:initform nil)))
(defmethod stream-element-type ((stream mailbox-output-stream))
'character)
(defmethod stream:stream-write-char ((stream mailbox-output-stream) char)
(mp:mailbox-send (mailbox-stream-mailbox stream)
(if (eql char #\Newline)
#\Line-Separator
char)))
(defmethod stream:stream-line-column ((stream mailbox-output-stream))
nil)
(defmethod stream:stream-start-line-p ((stream mailbox-output-stream))
nil)
Then you can use READ-LINE
, WRITE-LINE
, READ-CHAR
, WRITE-CHAR
on streams created like this:
(make-instance 'mailbox-input-stream :mailbox (mp:process-mailbox process))
(make-instance 'mailbox-output-stream :mailbox other-mailbox)