Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add circular-buffer, part of 48 in 24 #400

Merged
merged 7 commits into from
Jun 13, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add user-defined errors
kmarker1101 committed Jun 13, 2024
commit d4901536076143a7312fd7046648a71f97bd32c4
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
@@ -815,6 +815,14 @@
"prerequisites": [],
"difficulty": 5
},
{
"slug": "food-chain",
"name": "Food Chain",
"uuid": "ac1c0246-0fed-46e7-819a-0b013b2b4585",
"practices": [],
"prerequisites": [],
"difficulty": 5
},
{
"slug": "circular-buffer",
"name": "Circular Buffer",
9 changes: 7 additions & 2 deletions exercises/practice/circular-buffer/.meta/example.el
Original file line number Diff line number Diff line change
@@ -5,6 +5,10 @@
;;; Code:


(define-error 'empty-buffer-error "buffer is empty")

(define-error 'full-buffer-error "buffer is full")

(defclass circular-buffer ()
((capacity :initarg :capacity :initform 10)
(buf-modulus :initform 20)
@@ -13,6 +17,7 @@
(back :initform 0))
:documentation "Circular buffer class")


(cl-defmethod initialize-instance :after ((buf circular-buffer) &rest _)
(with-slots (capacity buf-modulus data) buf
(setf buf-modulus (* 2 capacity)
@@ -45,15 +50,15 @@
(cl-defmethod read-buff ((buf circular-buffer))
(with-slots (front data capacity) buf
(if (buf-empty-p buf)
(error "buffer is empty")
(signal 'empty-buffer-error nil)
(let ((v (aref data (mod front capacity))))
(advance-front buf)
v))))

(cl-defmethod write ((buf circular-buffer) v)
(with-slots (back data capacity) buf
(if (buf-full-p buf)
(error "buffer is full")
(signal 'full-buffer-error nil)
(progn
(aset data (mod back capacity) v)
(advance-back buf)))))
15 changes: 5 additions & 10 deletions exercises/practice/circular-buffer/circular-buffer-test.el
Original file line number Diff line number Diff line change
@@ -15,8 +15,7 @@

(ert-deftest reading-empty-buffer-should-fail ()
(let ((buf (create-test-buffer 1)))
(should (equal (should-error (read-buff buf))
'(error . ("buffer is empty"))))))
(should-error (read-buff buf) :type 'empty-buffer-error)))


(ert-deftest can-read-an-item-just-written ()
@@ -29,8 +28,7 @@
(let ((buf (create-test-buffer 1)))
(write buf 1)
(should (equal (read-buff buf) 1))
(should (equal (should-error (read-buff buf))
'(error . ("buffer is empty"))))))
(should-error (read-buff buf) :type 'empty-buffer-error)))


(ert-deftest items-are-read-in-the-order-they-are-written ()
@@ -44,8 +42,7 @@
(ert-deftest full-buffer-cant-be-written-to ()
(let ((buf (create-test-buffer 1)))
(write buf 1)
(should (equal (should-error (write buf 2))
'(error . ("buffer is full"))))))
(should-error (write buf 2) :type 'full-buffer-error)))


(ert-deftest a-read-frees-up-capacity-for-another-write ()
@@ -70,8 +67,7 @@
(let ((buf (create-test-buffer 1)))
(write buf 1)
(clear buf)
(should (equal (should-error (read-buff buf))
'(error . ("buffer is empty"))))))
(should-error (read-buff buf) :type 'empty-buffer-error)))


(ert-deftest clear-frees-up-capacity-for-another-write ()
@@ -128,8 +124,7 @@
(overwrite buf 4)
(should (equal (read-buff buf) 3))
(should (equal (read-buff buf) 4))
(should (equal (should-error (read-buff buf))
'(error . ("buffer is empty"))))))
(should-error (read-buff buf) :type 'empty-buffer-error)))


(provide 'circular-buffer-test)
6 changes: 6 additions & 0 deletions exercises/practice/circular-buffer/circular-buffer.el
Original file line number Diff line number Diff line change
@@ -5,6 +5,12 @@
;;; Code:


(define-error 'empty-buffer-error
(error "Delete this S-Expression and write your own implementation"))

(define-error 'full-buffer-error
(error "Delete this S-Expression and write your own implementation"))

(defclass circular-buffer ()
(error "Delete this S-Expression and write your own implementation"))