mirror of
https://github.com/elyby/chrly.git
synced 2025-05-31 14:11:51 +05:30
Rework project's structure
This commit is contained in:
40
internal/utils/queue.go
Normal file
40
internal/utils/queue.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Queue[T any] struct {
|
||||
lock sync.Mutex
|
||||
items []T
|
||||
}
|
||||
|
||||
func NewQueue[T any]() *Queue[T] {
|
||||
return &Queue[T]{
|
||||
items: []T{},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Queue[T]) Enqueue(item T) int {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
|
||||
s.items = append(s.items, item)
|
||||
|
||||
return len(s.items)
|
||||
}
|
||||
|
||||
func (s *Queue[T]) Dequeue(n int) ([]T, int) {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
|
||||
l := len(s.items)
|
||||
if n > l {
|
||||
n = l
|
||||
}
|
||||
|
||||
items := s.items[0:n]
|
||||
s.items = s.items[n:l]
|
||||
|
||||
return items, l - n
|
||||
}
|
38
internal/utils/queue_test.go
Normal file
38
internal/utils/queue_test.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestQueue(t *testing.T) {
|
||||
t.Run("Enqueue", func(t *testing.T) {
|
||||
s := NewQueue[string]()
|
||||
require.Equal(t, 1, s.Enqueue("username1"))
|
||||
require.Equal(t, 2, s.Enqueue("username2"))
|
||||
require.Equal(t, 3, s.Enqueue("username3"))
|
||||
})
|
||||
|
||||
t.Run("Dequeue", func(t *testing.T) {
|
||||
s := NewQueue[string]()
|
||||
s.Enqueue("username1")
|
||||
s.Enqueue("username2")
|
||||
s.Enqueue("username3")
|
||||
s.Enqueue("username4")
|
||||
s.Enqueue("username5")
|
||||
|
||||
items, queueLen := s.Dequeue(2)
|
||||
require.Len(t, items, 2)
|
||||
require.Equal(t, 3, queueLen)
|
||||
require.Equal(t, "username1", items[0])
|
||||
require.Equal(t, "username2", items[1])
|
||||
|
||||
items, queueLen = s.Dequeue(40)
|
||||
require.Len(t, items, 3)
|
||||
require.Equal(t, 0, queueLen)
|
||||
require.Equal(t, "username3", items[0])
|
||||
require.Equal(t, "username4", items[1])
|
||||
require.Equal(t, "username5", items[2])
|
||||
})
|
||||
}
|
7
internal/utils/time.go
Normal file
7
internal/utils/time.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package utils
|
||||
|
||||
import "time"
|
||||
|
||||
func UnixMillisecond(t time.Time) int64 {
|
||||
return t.UnixNano() / int64(time.Millisecond)
|
||||
}
|
16
internal/utils/time_test.go
Normal file
16
internal/utils/time_test.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"testing"
|
||||
|
||||
assert "github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestUnixMillisecond(t *testing.T) {
|
||||
loc, _ := time.LoadLocation("CET")
|
||||
d := time.Date(2021, 02, 26, 00, 43, 57, 987654321, loc)
|
||||
|
||||
assert.Equal(t, int64(1614296637987), UnixMillisecond(d))
|
||||
}
|
Reference in New Issue
Block a user