diff --git a/map.go b/map.go index 581a9b1..6515ac0 100644 --- a/map.go +++ b/map.go @@ -1,5 +1,7 @@ package extypes +import "reflect" + type HashMap[K comparable, V any] map[K]V func NewMapFrom[K comparable, V any](m map[K]V) HashMap[K, V] { @@ -9,9 +11,7 @@ func NewMapFrom[K comparable, V any](m map[K]V) HashMap[K, V] { } return out } -func (m HashMap[K, V]) Len() int { - return len(m) -} +func (m HashMap[K, V]) Len() int { return len(m) } func (m HashMap[K, V]) Add(key K, val V) HashMap[K, V] { m[key] = val return m @@ -20,9 +20,7 @@ func (m HashMap[K, V]) Remove(key K) HashMap[K, V] { delete(m, key) return m } -func (m HashMap[K, V]) Get(key K) V { - return m[key] -} +func (m HashMap[K, V]) Get(key K) V { return m[key] } func (m HashMap[K, V]) GetOrDefault(key K, def V) V { v, ok := m[key] if !ok { @@ -34,6 +32,26 @@ func (m HashMap[K, V]) Contains(key K) bool { _, ok := m[key] return ok } +func (m HashMap[K, V]) IndexKey(key K) int { + index := 0 + for k, _ := range m { + if k == key { + return index + } + index++ + } + return -1 +} +func (m HashMap[K, V]) IndexValue(value V) int { + index := 0 + for _, v := range m { + if reflect.DeepEqual(value, v) { + return index + } + index++ + } + return -1 +} func (m HashMap[K, V]) Keys() []K { keys := make([]K, 0, m.Len()) for k := range m { @@ -48,6 +66,16 @@ func (m HashMap[K, V]) Values() []V { } return values } +func (m HashMap[K, V]) Items() ([]K, []V) { + keys := make(Slice[K], 0, m.Len()) + values := make(Slice[V], 0, m.Len()) + for k, v := range m { + keys = keys.Push(k) + values = values.Push(v) + } + return keys, values +} + func (m HashMap[K, V]) Filter(f func(K, V) bool) HashMap[K, V] { out := make(HashMap[K, V]) for k, v := range m { @@ -58,3 +86,15 @@ func (m HashMap[K, V]) Filter(f func(K, V) bool) HashMap[K, V] { } return out } +func (m HashMap[K, V]) ForEach(f func(K, V)) HashMap[K, V] { + for k, v := range m { + f(k, v) + } + return m +} +func (m HashMap[K, V]) Map(f func(K, V) V) HashMap[K, V] { + for k, v := range m { + m[k] = f(k, v) + } + return m +} diff --git a/queue.go b/queue.go index 0566cbe..dc4dbca 100644 --- a/queue.go +++ b/queue.go @@ -10,62 +10,54 @@ var QueueFullErr = errors.New("queue full") type Queue[T any] struct { size uint64 mu sync.RWMutex - queue []T + queue Slice[T] } func CreateQueue[T any](size uint64) *Queue[T] { - return &Queue[T]{ - queue: make([]T, 0, size), - size: size, - } + return &Queue[T]{queue: make(Slice[T], 0, size), size: size} } +func (q *Queue[T]) Len() uint64 { + q.mu.RLock() + defer q.mu.RUnlock() + return uint64(q.queue.Len()) +} +func (q *Queue[T]) IsEmpty() bool { return q.Len() == 0 } +func (q *Queue[T]) IsFull() bool { return q.Len() == q.size } +func (q *Queue[T]) Size() uint64 { return q.size } + func (q *Queue[T]) Enqueue(el T) error { if q.IsFull() { return QueueFullErr } - q.queue = append(q.queue, el) + q.queue = q.queue.Push(el) return nil } -func (q *Queue[T]) Peak() T { - q.mu.RLock() - defer q.mu.RUnlock() - return q.queue[0] -} - -func (q *Queue[T]) IsEmpty() bool { - return q.Length() == 0 -} - -func (q *Queue[T]) IsFull() bool { - return q.Length() == q.size -} - -func (q *Queue[T]) Length() uint64 { - q.mu.RLock() - defer q.mu.RUnlock() - return uint64(len(q.queue)) -} - func (q *Queue[T]) Dequeue() T { q.mu.RLock() - el := q.queue[0] + el := q.queue.Get(0) q.mu.RUnlock() - if q.Length() == 1 { + if q.Len() == 1 { q.mu.Lock() - q.queue = make([]T, 0) + q.queue = make(Slice[T], 0) q.mu.Unlock() return el } q.mu.Lock() - q.queue = q.queue[1:] + q.queue = q.queue.Pop(0) q.mu.Unlock() return el } -func (q *Queue[T]) Raw() []T { +func (q *Queue[T]) Peak() T { + q.mu.RLock() + defer q.mu.RUnlock() + return q.queue.Get(0) +} + +func (q *Queue[T]) Raw() Slice[T] { return q.queue } diff --git a/set.go b/set.go index b2e8c57..e92b9dd 100644 --- a/set.go +++ b/set.go @@ -16,18 +16,12 @@ func NewSetFrom[T any](slice []T) Set[T] { } return s } -func (s Set[T]) Len() int { - return len(s) -} -func (s Set[T]) Cap() int { - return cap(s) -} -func (s Set[T]) Get(index int) T { - return s[index] -} -func (s Set[T]) Last() T { - return s[s.Len()-1] -} +func (s Set[T]) Len() int { return len(s) } +func (s Set[T]) Cap() int { return cap(s) } +func (s Set[T]) Get(index int) T { return s[index] } +func (s Set[T]) Last() T { return s.Get(s.Len() - 1) } +func (s Set[T]) First() T { return s.Get(0) } + func (s Set[T]) Index(el T) int { for i := range s { if reflect.DeepEqual(s[i], el) { @@ -62,33 +56,6 @@ func (s Set[T]) Remove(el T) Set[T] { } return s.Pop(index) } -func (s Set[T]) Filter(f func(e T) bool) Set[T] { - out := make(Set[T], 0) - for _, v := range s { - if f(v) { - out = append(out, v) - } - } - return out -} -func (s Set[T]) ToSlice() Slice[T] { - out := make(Slice[T], s.Len()) - copy(out, s) - return out -} -func (s Set[T]) ToArray() []T { - out := make([]T, len(s)) - copy(out, s) - return out -} -func (s Set[T]) ToAnyArray() []any { - out := make([]any, len(s)) - for i, v := range s { - out[i] = v - } - return out -} - func (s Set[T]) Equal(s2 Set[T]) bool { if s.Len() != s2.Len() { return false @@ -103,3 +70,41 @@ func (s Set[T]) Equal(s2 Set[T]) bool { } return true } + +func (s Set[T]) ToSlice() Slice[T] { return NewSliceFrom(s) } +func (s Set[T]) ToTuple() Tuple[T] { return NewTupleFrom(s) } +func (s Set[T]) ToArray() []T { + out := make([]T, len(s)) + copy(out, s) + return out +} +func (s Set[T]) ToAnyArray() []any { + out := make([]any, len(s)) + for i, v := range s { + out[i] = v + } + return out +} +func (s Set[T]) Filter(f func(e T) bool) Set[T] { + out := make(Set[T], 0) + for _, v := range s { + if f(v) { + out = append(out, v) + } + } + return out +} +func (s Set[T]) ForEach(f func(int, T)) Set[T] { + for i, v := range s { + f(i, v) + } + return s +} + +// Map is mutable func +func (s Set[T]) Map(f func(e T) T) Set[T] { + for i, v := range s { + s[i] = f(v) + } + return s +} diff --git a/slice.go b/slice.go index d9961bc..d0bdeba 100644 --- a/slice.go +++ b/slice.go @@ -11,18 +11,12 @@ func NewSliceFrom[T any](slice []T) Slice[T] { copy(s, slice) return s } -func (s Slice[T]) Len() int { - return len(s) -} -func (s Slice[T]) Cap() int { - return cap(s) -} -func (s Slice[T]) Get(index int) T { - return s[index] -} -func (s Slice[T]) Last() T { - return s.Get(s.Len() - 1) -} +func (s Slice[T]) Len() int { return len(s) } +func (s Slice[T]) Cap() int { return cap(s) } +func (s Slice[T]) Get(index int) T { return s[index] } +func (s Slice[T]) Last() T { return s.Get(s.Len() - 1) } +func (s Slice[T]) First() T { return s.Get(0) } + func (s Slice[T]) Index(el T) int { for i := range s { if reflect.DeepEqual(s[i], el) { @@ -32,27 +26,7 @@ func (s Slice[T]) Index(el T) int { return -1 } -// Swap is mutable func -func (s Slice[T]) Swap(i, j int) Slice[T] { - s[i], s[j] = s[j], s[i] - return s -} -func (s Slice[T]) Filter(f func(e T) bool) Slice[T] { - out := make(Slice[T], 0) - for _, v := range s { - if f(v) { - out = append(out, v) - } - } - return out -} -func (s Slice[T]) Map(f func(e T) T) Slice[T] { - out := make(Slice[T], s.Len()) - for i, v := range s { - out[i] = f(v) - } - return out -} +func (s Slice[T]) Push(e T) Slice[T] { return append(s, e) } func (s Slice[T]) Pop(index int) Slice[T] { if index == 0 { return s[1:] @@ -69,31 +43,10 @@ func (s Slice[T]) Remove(el T) Slice[T] { } return s.Pop(index) } -func (s Slice[T]) Push(e T) Slice[T] { - return append(s, e) -} -func (s Slice[T]) ToArray() []T { - out := make([]T, len(s)) - copy(out, s) - return out -} -func (s Slice[T]) ToAnyArray() []any { - out := make([]any, len(s)) - for i, v := range s { - out[i] = v - } - return out -} -func (s Slice[T]) ToSet() Set[T] { - return NewSetFrom(s) -} - -// ForEach is mutable func -func (s Slice[T]) ForEach(f func(e T) T) Slice[T] { - for i, v := range s { - s[i] = f(v) - } +// Swap is mutable func +func (s Slice[T]) Swap(i, j int) Slice[T] { + s[i], s[j] = s[j], s[i] return s } @@ -111,3 +64,42 @@ func (s Slice[T]) Equal(s2 Slice[T]) bool { } return true } + +func (s Slice[T]) ToArray() []T { + out := make([]T, len(s)) + copy(out, s) + return out +} +func (s Slice[T]) ToAnyArray() []any { + out := make([]any, len(s)) + for i, v := range s { + out[i] = v + } + return out +} +func (s Slice[T]) ToSet() Set[T] { return NewSetFrom(s) } +func (s Slice[T]) ToTuple() Tuple[T] { return NewTupleFrom(s) } + +func (s Slice[T]) Filter(f func(e T) bool) Slice[T] { + out := make(Slice[T], 0) + for _, v := range s { + if f(v) { + out = append(out, v) + } + } + return out +} +func (s Slice[T]) ForEach(f func(int, T)) Slice[T] { + for i, v := range s { + f(i, v) + } + return s +} + +// Map is mutable func +func (s Slice[T]) Map(f func(e T) T) Slice[T] { + for i, v := range s { + s[i] = f(v) + } + return s +} diff --git a/tuple.go b/tuple.go new file mode 100644 index 0000000..6078c00 --- /dev/null +++ b/tuple.go @@ -0,0 +1,60 @@ +package extypes + +import "reflect" + +type Tuple[T any] struct { + s Slice[T] +} + +func NewTupleFrom[T any](src []T) Tuple[T] { + return Tuple[T]{src} +} +func (t Tuple[T]) Len() int { return t.s.Len() } +func (t Tuple[T]) Cap() int { return t.s.Cap() } +func (t Tuple[T]) Get(index int) T { return t.s.Get(index) } +func (t Tuple[T]) Equal(t2 Tuple[T]) bool { + if t.Len() != t2.Len() { + return false + } + if t.Cap() != t2.Cap() { + return false + } + for i := range t.s { + if !reflect.DeepEqual(t.s[i], t2.s[i]) { + return false + } + } + return true +} + +func (t Tuple[T]) ToArray() []T { + out := make([]T, t.Len()) + copy(out, t.s) + return out +} +func (t Tuple[T]) ToAnyArray() []any { + out := make([]any, t.Len()) + for i, v := range t.s { + out[i] = v + } + return out +} +func (t Tuple[T]) ToSet() Set[T] { return NewSetFrom(t.s) } +func (t Tuple[T]) ToSlice() Slice[T] { return NewSliceFrom(t.s) } + +func (t Tuple[T]) Filter(f func(e T) bool) Tuple[T] { + out := make(Slice[T], 0) + for _, v := range t.s { + if f(v) { + out = append(out, v) + } + } + t.s = out + return t +} +func (t Tuple[T]) ForEach(f func(int, T)) Tuple[T] { + for i, v := range t.s { + f(i, v) + } + return t +}