diff --git a/main.rkt b/main.rkt index 31f3811..3471c07 100644 --- a/main.rkt +++ b/main.rkt @@ -267,4 +267,5 @@ (err-test "Dit is nog een foutbericht") (fatal-test "JA!") (dbg-test "Oke, nog een debug bericht") + (sl-log-to-store 10) ) diff --git a/private/store.rkt b/private/store.rkt index 767c4a2..c6f573c 100644 --- a/private/store.rkt +++ b/private/store.rkt @@ -11,6 +11,7 @@ sl-store-grep-level sl-store-grep sl-store-tail + sl-store-head sl-store-enqueue! sl-store->list sl-store->display @@ -105,7 +106,7 @@ (if (> (queue-length queue) ml) (begin (dequeue! queue) - (set-sl-store-length! store (- sl-store-length store 1)) + (set-sl-store-length! store (- (sl-store-length store) 1)) (loop)) #t)) ) @@ -195,8 +196,12 @@ (queue-length nq) nq)))) + +(define (int>0? a) + (and (integer? a) (> a 0))) + (define/contract (sl-store-tail store n) - (-> sl-store? number? sl-store?) + (-> sl-store? int>0? sl-store?) (let* ((q (sl-store-queue store)) (from (if (>= n (queue-length q)) 0 @@ -210,5 +215,18 @@ (set! i (+ i 1)) #f)))))) (make-sl-store* (sl-store-max-length store) (queue-length nq) nq)))) + +(define/contract (sl-store-head store n) + (-> sl-store? int>0? sl-store?) + (let* ((q (sl-store-queue store)) + (until (if (>= n (queue-length q)) + (queue-length q) + n)) + (i 0)) + (let ((nq (copy-queue q + (λ (item) + (set! i (+ i 1)) + (<= i n))))) + (make-sl-store* (sl-store-max-length store) (queue-length nq) nq)))) diff --git a/scrbl/simple-log.scrbl b/scrbl/simple-log.scrbl index b1f6b88..4d6ab62 100644 --- a/scrbl/simple-log.scrbl +++ b/scrbl/simple-log.scrbl @@ -288,6 +288,15 @@ Returns a store containing the last @racket[count] entries. If @racket[count] is greater than the store length, all entries are returned. } + +@defproc[(sl-store-head [store any/c] + [count exact-nonnegative-integer?]) + any/c]{ + +Returns a store containing the first @racket[count] entries. If +@racket[count] is greater than the store length, all entries are returned. +} + @section{Store examples} @racketblock[