Skip to content

Instantly share code, notes, and snippets.

@bo-tato
Created May 20, 2023 12:45
Show Gist options
  • Save bo-tato/756c3b3e6935ce397e4baf635d800f66 to your computer and use it in GitHub Desktop.
Save bo-tato/756c3b3e6935ce397e4baf635d800f66 to your computer and use it in GitHub Desktop.
(defpackage logged-stream
(:use cl trivial-gray-streams)
(:import-from flexi-streams make-in-memory-output-stream get-output-stream-sequence)
(:export make-logged-stream get-input get-ouput))
(in-package logged-stream)
(defclass logged-stream (fundamental-binary-output-stream fundamental-binary-input-stream)
((stream :initarg :stream :accessor base-stream)
(input :initform (make-in-memory-output-stream) :accessor logged-input)
(output :initform (make-in-memory-output-stream) :accessor logged-output)))
(defun make-logged-stream (stream)
(make-instance 'logged-stream :stream stream))
(defun get-input (stream)
(get-output-stream-sequence (logged-input stream)))
(defun get-output (stream)
(get-output-stream-sequence (logged-output stream)))
(defmethod stream-read-sequence ((stream logged-stream) sequence start end &key &allow-other-keys)
(with-slots (stream input) stream
(prog1 (read-sequence sequence stream :start start :end end)
(write-sequence sequence input :start start :end end))))
(defmethod stream-write-sequence ((stream logged-stream) sequence start end &key &allow-other-keys)
(with-slots (stream output) stream
(write-sequence sequence output :start start :end end)
(write-sequence sequence stream :start start :end end)))
(defmethod stream-force-output ((stream logged-stream))
(force-output (base-stream stream)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment