From 5540e65426998ecb56495e1921a76e837770afd0 Mon Sep 17 00:00:00 2001 From: Natercio Moniz Date: Wed, 12 Nov 2025 12:47:31 +0000 Subject: [PATCH] add Peek method to RecordQueue --- internal/record.go | 27 +++++++++++++++++++++------ internal/record_test.go | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/internal/record.go b/internal/record.go index 68b2301..def8114 100644 --- a/internal/record.go +++ b/internal/record.go @@ -36,14 +36,10 @@ func (rq *RecordQueue) Push(r Record) { rq.l.PushBack(r) } -// Pop removes and returns the first Record of the list as the first return value. If the list is +// Pop removes and returns the first Record of the queue in the 1st return value. If the list is // empty returns falso on the 2nd return value, true otherwise. func (rq *RecordQueue) Pop() (Record, bool) { - if rq == nil || rq.l == nil { - return nil, false - } - - el := rq.l.Front() + el := rq.frontElement() if el == nil { return nil, false } @@ -53,6 +49,25 @@ func (rq *RecordQueue) Pop() (Record, bool) { return val.(Record), true } +// Peek returns the front Record of the queue in the 1st return value. If the list is empty returns +// falso on the 2nd return value, true otherwise. +func (rq *RecordQueue) Peek() (Record, bool) { + el := rq.frontElement() + if el == nil { + return nil, false + } + + return el.Value.(Record), true +} + +func (rq *RecordQueue) frontElement() *list.Element { + if rq == nil || rq.l == nil { + return nil + } + + return rq.l.Front() +} + func (rq *RecordQueue) Len() int { if rq == nil || rq.l == nil { return 0 diff --git a/internal/record_test.go b/internal/record_test.go index 5d5c505..e7b237f 100644 --- a/internal/record_test.go +++ b/internal/record_test.go @@ -14,6 +14,7 @@ func TestRecordQueue(t *testing.T) { } var rq RecordQueue + if rq.Len() != 0 { t.Fatalf("zero value should have zero lenght") } @@ -23,6 +24,11 @@ func TestRecordQueue(t *testing.T) { t.Fatalf("Pop() should return (_,false) on a zero value") } + _, ok = rq.Peek() + if ok { + t.Fatalf("Peek() should return (_,false) on a zero value") + } + rq.Push(nil) if rq.Len() != 0 { t.Fatalf("pushing nil should be a no-op") @@ -38,18 +44,39 @@ func TestRecordQueue(t *testing.T) { t.Fatalf("pushing 2nd record should result in lenght of 2") } - rec, ok := rq.Pop() + peekRec, ok := rq.Peek() + if !ok { + t.Fatalf("Peek() should return (_,true) when the list is not empty") + } + + if peekRec, ok := peekRec.(testRecord); ok { + if peekRec.id != 1 { + t.Fatalf("Peek() should return the 1st record pushed but returned %d", peekRec.id) + } + } else { + t.Fatalf("Peek() should return the original record type") + } + + if rq.Len() != 2 { + t.Fatalf("Peek() should not affect the list length") + } + + popRec, ok := rq.Pop() if !ok { t.Fatalf("Pop() should return (_,true) when the list is not empty") } - if rec, ok := rec.(testRecord); ok { + if rec, ok := popRec.(testRecord); ok { if rec.id != 1 { t.Fatalf("Pop() should return the first record pushed but returned %d", rec.id) } } else { t.Fatalf("Pop() should return the original record") } + + if rq.Len() != 1 { + t.Fatalf("Pop() should remove an element from the list") + } } func TestRecordQueueNilReceiver(t *testing.T) { @@ -59,7 +86,12 @@ func TestRecordQueueNilReceiver(t *testing.T) { t.Fatalf("nil receiver should have zero lenght") } - _, ok := rq.Pop() + _, ok := rq.Peek() + if ok { + t.Fatalf("Peek() on a nil receiver should return (_,false)") + } + + _, ok = rq.Pop() if ok { t.Fatalf("Pop() on a nil receiver should return (_,false)") }