Skip to content

unmango/go

Folders and files

NameName
Last commit message
Last commit date
Mar 11, 2025
Dec 18, 2024
Jan 10, 2025
Oct 10, 2024
Jan 2, 2025
Nov 26, 2024
Jan 13, 2025
Feb 12, 2025
Jan 1, 2025
Feb 12, 2025
Nov 26, 2024
Nov 26, 2024
Oct 14, 2024
Nov 12, 2024
Dec 19, 2024
Feb 12, 2025
Jan 13, 2025
Nov 18, 2024
Jan 1, 2025
Oct 10, 2024
Nov 26, 2024
Nov 12, 2024
Oct 9, 2024
Mar 11, 2025
Jan 13, 2025
Feb 12, 2025
Apr 1, 2025
Apr 1, 2025

Repository files navigation

Go Source code for UnMango

A collection of random Go packages.

iter

The iter package builds on the standard iter package. It re-exports Seq and Seq2 for convenience and adds Seq3. It adds sequence creation functions such as Empty, Singleton, and Values.

var seq Seq[int] = iter.Empty[int]()
var seq Seq[int] = iter.Singleton(69)
var seq Seq[int] = iter.Values(69, 420)

It also adds various sequence operations such as Map, Fold, and Filter.

var seq Seq[int] = iter.Values(69, 420)

// [70, 421]
mapped := iter.Map(seq, func(i int) int {
	return i + 1
})

// 489
sum := iter.Fold(seq, func(acc, i int) {
	return acc + i
}, 0)

// [69]
filtered := iter.Filter(seq, func(i int) bool {
	return i != 420
})

maps

Primarily re-exports functions and types for convenience. Due to Go not currently supporting generic type aliases, these functions adapt the standard iter seq to this module's iter package.

func Test(seq iter.Seq2[string, int]) {
	var m map[string]int = maps.Collect(seq)
}

The maps package also adds AppendSeq for appending a map to a Seq2.

seq := maps.All(map[string]string{"foo": "bar"})

// {"foo": "bar", "bin": "baz"}
seq = maps.AppendSeq(seq, map[string]string{"bin": "baz"})

result

The result pakcage adds the Result type representing either success or error. It also adds various result operations such as Map and Bind.

func main() {
	var r Result[int] = func() (int, error) {
		return 420, nil
	}

	r = result.Map(r, func(x int) int {
		return x+1
	})
}

slices

The slices package re-exports functions and types from the standard slices package for convenience. Due to Go not currently supporting generic type aliases, these functions adapt the standard slices seq to this module's slices package.

rx

The rx package attempts to implement the observable and signal patterns for reactive programming in go. Both observable and signal should be considered a 🚧 work in progress 🚧, but the observable package is generally usable.

var obs rx.Observable[int] = subject.New[int]()

sub := obs.Subscribe(observer.Lift(func(i int) {
	fmt.Println(i)
}))
defer sub()

obs.OnNext(69)
obs.OnComplete()

Inspiration

I stand on the shoulders of giants. A lot of this is inspired by the works of others, be sure to check out these repos as well. (They're much smarter than me)

https://github.com/fogfish/golem

https://github.com/IBM/fp-go