(in-package #:cursed) (defclass text () ((data :type simple-string :initarg :data :reader data :initform "") (index :type (unsigned-byte 44) :initarg :index :accessor index :initform 0))) (defun has-data? (cursor) (< (index cursor) (length (data cursor)))) (defun peek (cursor) (char (data cursor) (index cursor))) (defun advance (cursor) (make-instance 'text :data (data cursor) :index (+ (index cursor) 1))) (defun distance (from to) (- (index to) (index from))) (defmethod print-object ((obj text) stream) (print-unreadable-object (obj stream :type t) (let ((str (if (has-data? obj) (format nil "~{~a~a~a~}" (str:context-window (data obj) (index obj) :side-length 10)) "END OF DATA"))) (substitute #\↲ #\Newline str))))