summaryrefslogtreecommitdiff
path: root/cursor.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'cursor.lisp')
-rw-r--r--cursor.lisp31
1 files changed, 31 insertions, 0 deletions
diff --git a/cursor.lisp b/cursor.lisp
new file mode 100644
index 0000000..d3012ab
--- /dev/null
+++ b/cursor.lisp
@@ -0,0 +1,31 @@
+(in-package #:cursor)
+
+(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))))