From 4bc7680ff7f9d163455f9262461a551f32349016 Mon Sep 17 00:00:00 2001 From: Sangeeth Sudheer Date: Sat, 27 Apr 2024 11:37:29 +0530 Subject: [PATCH] Add generics --- generics/generics.go | 63 ++++++++++++++++++++++++++++++++++++++++++++ main.go | 6 +++-- 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 generics/generics.go diff --git a/generics/generics.go b/generics/generics.go new file mode 100644 index 0000000..9dc13d3 --- /dev/null +++ b/generics/generics.go @@ -0,0 +1,63 @@ +package generics + +import ( + "fmt" + "io" + "os" +) + +type LinkedList[T any] struct { + Head *LinkedListElement[T] + Tail *LinkedListElement[T] +} + +type LinkedListElement[T any] struct { + Next *LinkedListElement[T] + Value T +} + +func NewLinkedList[T any]() *LinkedList[T] { + return &LinkedList[T]{} +} + +func (lst *LinkedList[T]) Push(value T) *LinkedListElement[T] { + node := &LinkedListElement[T]{ + Value: value, + } + + if lst.Head == nil { + lst.Head = node + lst.Tail = node + } + + lst.Tail.Next = node + lst.Tail = lst.Tail.Next + + return lst.Tail +} + +func (lst *LinkedList[T]) Print(out io.Writer) { + curr := lst.Head + + for curr != nil { + fmt.Fprint(out, curr.Value) + + if curr.Next != nil { + fmt.Fprint(out, " → ") + } + + curr = curr.Next + } + + fmt.Fprintln(out) +} + +func Generics() { + lst := NewLinkedList[int]() + + for i := range 5 { + lst.Push(i) + } + + lst.Print(os.Stdout) +} diff --git a/main.go b/main.go index 29c9ec5..8ba8a87 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,11 @@ package main // import "git.sangeeth.dev/gobyexample/runes" -import "git.sangeeth.dev/gobyexample/structs" +// import "git.sangeeth.dev/gobyexample/structs" +import "git.sangeeth.dev/gobyexample/generics" func main() { // runes.Runes() - structs.Structs() + // structs.Structs() + generics.Generics() }