initial commit
This commit is contained in:
commit
9f3c498f5b
58
impl_list_array.go
Normal file
58
impl_list_array.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type ArrayList[T any] struct {
|
||||||
|
values []T
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ List[int] = &ArrayList[int]{}
|
||||||
|
|
||||||
|
func NewArrayList[T any](initCap int) *ArrayList[T] {
|
||||||
|
return &ArrayList[T]{make([]T, 0, initCap)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) init() {
|
||||||
|
if s.values == nil {
|
||||||
|
s.values = make([]T, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) Add(value T) {
|
||||||
|
s.init()
|
||||||
|
s.values = append(s.values, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) AddAll(values Iterable[T]) {
|
||||||
|
values.Each(s.Add)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) Get(index int) T {
|
||||||
|
s.init()
|
||||||
|
return s.values[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) RemoveAt(index int) T {
|
||||||
|
s.init()
|
||||||
|
ret := s.values[index]
|
||||||
|
s.values = append(s.values[:index], s.values[index+1:]...)
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) Clear() {
|
||||||
|
s.values = make([]T, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) Size() int {
|
||||||
|
s.init()
|
||||||
|
return len(s.values)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) Empty() bool {
|
||||||
|
return s.Size() == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ArrayList[T]) Each(f func(value T)) {
|
||||||
|
s.init()
|
||||||
|
for _, value := range s.values {
|
||||||
|
f(value)
|
||||||
|
}
|
||||||
|
}
|
112
impl_list_linked.go
Normal file
112
impl_list_linked.go
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type LinkedList[T any] struct {
|
||||||
|
head *linkedListNode[T]
|
||||||
|
tail *linkedListNode[T]
|
||||||
|
length int
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ List[int] = &LinkedList[int]{}
|
||||||
|
|
||||||
|
func NewLinkedList[T any]() *ArrayList[T] {
|
||||||
|
return &ArrayList[T]{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) Add(value T) {
|
||||||
|
if l.length == 0 {
|
||||||
|
l.head = &linkedListNode[T]{value: value}
|
||||||
|
l.tail = l.head
|
||||||
|
l.length++
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newNode := &linkedListNode[T]{
|
||||||
|
value: value,
|
||||||
|
prev: l.tail,
|
||||||
|
}
|
||||||
|
l.tail.next = newNode
|
||||||
|
l.tail = newNode
|
||||||
|
l.length++
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) AddAll(values Iterable[T]) {
|
||||||
|
values.Each(l.Add)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) Get(index int) T {
|
||||||
|
return l.getNode(index).value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) RemoveAt(index int) T {
|
||||||
|
node := l.getNode(index)
|
||||||
|
|
||||||
|
if node.prev != nil {
|
||||||
|
node.prev.next = node.next
|
||||||
|
} else {
|
||||||
|
l.head = node.next
|
||||||
|
}
|
||||||
|
|
||||||
|
if node.next != nil {
|
||||||
|
node.next.prev = node.prev
|
||||||
|
} else {
|
||||||
|
l.tail = node.prev
|
||||||
|
}
|
||||||
|
|
||||||
|
l.length--
|
||||||
|
return node.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) Clear() {
|
||||||
|
l.head = nil
|
||||||
|
l.tail = nil
|
||||||
|
l.length = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) Each(f func(value T)) {
|
||||||
|
node := l.head
|
||||||
|
for node != nil {
|
||||||
|
f(node.value)
|
||||||
|
node = node.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) Size() int {
|
||||||
|
return l.length
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) Empty() bool {
|
||||||
|
return l.Size() == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LinkedList[T]) getNode(index int) *linkedListNode[T] {
|
||||||
|
if index == 0 {
|
||||||
|
return l.head
|
||||||
|
}
|
||||||
|
|
||||||
|
if index == l.length-1 {
|
||||||
|
return l.tail
|
||||||
|
}
|
||||||
|
|
||||||
|
if index > l.length/2 {
|
||||||
|
index = l.length - index
|
||||||
|
node := l.tail
|
||||||
|
for index > 0 {
|
||||||
|
node = node.prev
|
||||||
|
index--
|
||||||
|
}
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
node := l.head
|
||||||
|
for index > 0 {
|
||||||
|
node = node.next
|
||||||
|
index--
|
||||||
|
}
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
type linkedListNode[T any] struct {
|
||||||
|
value T
|
||||||
|
next *linkedListNode[T]
|
||||||
|
prev *linkedListNode[T]
|
||||||
|
}
|
8
impl_queue_array.go
Normal file
8
impl_queue_array.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type ArrayQueue[T any] ListQueue[T]
|
||||||
|
|
||||||
|
func NewArrayQueue[T any]() *ArrayQueue[T] {
|
||||||
|
stack := NewListQueue[T](new(ArrayList[T]))
|
||||||
|
return (*ArrayQueue[T])(stack)
|
||||||
|
}
|
8
impl_queue_linked_list.go
Normal file
8
impl_queue_linked_list.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type LinkedListQueue[T any] ListQueue[T]
|
||||||
|
|
||||||
|
func NewLinkedListQueue[T any]() *LinkedListQueue[T] {
|
||||||
|
stack := NewListQueue[T](new(LinkedList[T]))
|
||||||
|
return (*LinkedListQueue[T])(stack)
|
||||||
|
}
|
43
impl_queue_list.go
Normal file
43
impl_queue_list.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type ListQueue[T any] struct {
|
||||||
|
list List[T]
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Queue[int] = &ListQueue[int]{}
|
||||||
|
|
||||||
|
func NewListQueue[T any](list List[T]) *ListQueue[T] {
|
||||||
|
return &ListQueue[T]{list}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) Enqueue(value T) {
|
||||||
|
s.list.Add(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) Add(value T) {
|
||||||
|
s.Enqueue(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) AddAll(values Iterable[T]) {
|
||||||
|
values.Each(s.Add)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) Dequeue() T {
|
||||||
|
return s.list.RemoveAt(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) Peek() T {
|
||||||
|
return s.PeekAt(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) PeekAt(index int) T {
|
||||||
|
return s.list.Get(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) Size() int {
|
||||||
|
return s.list.Size()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListQueue[T]) Empty() bool {
|
||||||
|
return s.Size() == 0
|
||||||
|
}
|
61
impl_set.go
Normal file
61
impl_set.go
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type Set[T comparable] struct {
|
||||||
|
values map[T]struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Coll[int] = &Set[int]{}
|
||||||
|
|
||||||
|
func NewSet[T comparable]() *Set[T] {
|
||||||
|
return &Set[T]{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) init() {
|
||||||
|
if s.values == nil {
|
||||||
|
s.values = map[T]struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Add(value T) {
|
||||||
|
s.init()
|
||||||
|
s.values[value] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) AddAll(values Iterable[T]) {
|
||||||
|
s.init()
|
||||||
|
values.Each(s.Add)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Remove(value T) {
|
||||||
|
s.init()
|
||||||
|
delete(s.values, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) RemoveAll(values Iterable[T]) {
|
||||||
|
values.Each(s.Remove)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Clear() {
|
||||||
|
s.values = map[T]struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Has(value T) bool {
|
||||||
|
s.init()
|
||||||
|
_, ok := s.values[value]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Size() int {
|
||||||
|
s.init()
|
||||||
|
return len(s.values)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Empty() bool {
|
||||||
|
return s.Size() == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Set[T]) Each(f func(value T)) {
|
||||||
|
for value := range s.values {
|
||||||
|
f(value)
|
||||||
|
}
|
||||||
|
}
|
8
impl_stack_array.go
Normal file
8
impl_stack_array.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type ArrayStack[T any] ListStack[T]
|
||||||
|
|
||||||
|
func NewArrayStack[T any]() *ArrayStack[T] {
|
||||||
|
stack := NewListStack[T](new(ArrayList[T]))
|
||||||
|
return (*ArrayStack[T])(stack)
|
||||||
|
}
|
8
impl_stack_linked_list.go
Normal file
8
impl_stack_linked_list.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type LinkedListStack[T any] ListStack[T]
|
||||||
|
|
||||||
|
func NewLinkedListStack[T any]() *ArrayStack[T] {
|
||||||
|
stack := NewListStack[T](new(LinkedList[T]))
|
||||||
|
return (*ArrayStack[T])(stack)
|
||||||
|
}
|
43
impl_stack_list.go
Normal file
43
impl_stack_list.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type ListStack[T any] struct {
|
||||||
|
list List[T]
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Stack[int] = &ListStack[int]{}
|
||||||
|
|
||||||
|
func NewListStack[T any](list List[T]) *ListStack[T] {
|
||||||
|
return &ListStack[T]{list}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) Push(value T) {
|
||||||
|
s.list.Add(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) Add(value T) {
|
||||||
|
s.Push(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) AddAll(values Iterable[T]) {
|
||||||
|
values.Each(s.Add)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) Pop() T {
|
||||||
|
return s.list.RemoveAt(s.list.Size() - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) Peek() T {
|
||||||
|
return s.PeekAt(s.Size() - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) PeekAt(index int) T {
|
||||||
|
return s.list.Get(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) Size() int {
|
||||||
|
return s.list.Size()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ListStack[T]) Empty() bool {
|
||||||
|
return s.Size() == 0
|
||||||
|
}
|
8
int_coll.go
Normal file
8
int_coll.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type Coll[T any] interface {
|
||||||
|
Addable[T]
|
||||||
|
Iterable[T]
|
||||||
|
Sized
|
||||||
|
Clearable
|
||||||
|
}
|
7
int_list.go
Normal file
7
int_list.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type List[T any] interface {
|
||||||
|
Coll[T]
|
||||||
|
Indexable[int, T]
|
||||||
|
IndexedRemovable[int, T]
|
||||||
|
}
|
1
int_map.go
Normal file
1
int_map.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
// TODO
|
12
int_queue.go
Normal file
12
int_queue.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type Queue[T any] interface {
|
||||||
|
Addable[T]
|
||||||
|
Sized
|
||||||
|
|
||||||
|
Enqueue(value T)
|
||||||
|
Dequeue() T
|
||||||
|
|
||||||
|
Peek() T
|
||||||
|
PeekAt(index int) T
|
||||||
|
}
|
12
int_stack.go
Normal file
12
int_stack.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type Stack[T any] interface {
|
||||||
|
Addable[T]
|
||||||
|
Sized
|
||||||
|
|
||||||
|
Push(value T)
|
||||||
|
Pop() T
|
||||||
|
|
||||||
|
Peek() T
|
||||||
|
PeekAt(index int) T
|
||||||
|
}
|
1
int_tree.go
Normal file
1
int_tree.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
// TODO
|
36
interfaces.go
Normal file
36
interfaces.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package ds
|
||||||
|
|
||||||
|
type Addable[T any] interface {
|
||||||
|
Add(value T)
|
||||||
|
AddAll(values Iterable[T])
|
||||||
|
}
|
||||||
|
|
||||||
|
type Retrievable[T comparable] interface {
|
||||||
|
Has(value T) bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Indexable[K comparable, T any] interface {
|
||||||
|
Get(index K) T
|
||||||
|
}
|
||||||
|
|
||||||
|
type IndexedRemovable[K comparable, T any] interface {
|
||||||
|
RemoveAt(index K) T
|
||||||
|
}
|
||||||
|
|
||||||
|
type ComparingRemovable[T any] interface {
|
||||||
|
Remove(value T)
|
||||||
|
RemoveAll(values Iterable[T])
|
||||||
|
}
|
||||||
|
|
||||||
|
type Clearable interface {
|
||||||
|
Clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
type Sized interface {
|
||||||
|
Size() int
|
||||||
|
Empty() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Iterable[T any] interface {
|
||||||
|
Each(f func(value T))
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user