mirror of gomap just cuz
Go to file
2021-08-19 17:13:22 -04:00
.gitignore initial commit 2021-08-18 04:03:33 -04:00
box_list.go initial commit 2021-08-18 04:03:33 -04:00
callable.go feat: slice support 2021-08-19 17:13:22 -04:00
go.mod initial commit 2021-08-18 04:03:33 -04:00
go.sum initial commit 2021-08-18 04:03:33 -04:00
handles.go feat: slice support 2021-08-19 17:13:22 -04:00
iterator_test.go initial commit 2021-08-18 04:03:33 -04:00
iterator.go (iterator): utilise a pointer to avoid copying of array elements 2021-08-18 19:30:55 -04:00
LICENSE initial commit 2021-08-18 04:03:33 -04:00
list.go feat: slice support 2021-08-19 17:13:22 -04:00
map_test.go initial commit 2021-08-18 04:03:33 -04:00
map.go initial commit 2021-08-18 04:03:33 -04:00
README.md feat: slice support 2021-08-19 17:13:22 -04:00
remap.go feat: slice support 2021-08-19 17:13:22 -04:00
slice_test.go feat: slice support 2021-08-19 17:13:22 -04:00
slice.go feat: slice support 2021-08-19 17:13:22 -04:00

gomap

Map functions utilizing basic interfaces, assertions, and ptypes.

This code and ptypes are both artistic bloat, utilised for DX concepts and/or type-evading for operations.

Usage

Basic Setup
import (
	"github.com/prequist/gomap"
)

func Showcase() {
	// gomap.Transformer
	transformer := func(i interface{}) interface{} {
		// type assert the interface and add 1.
		return i.(int) + 1
    }
    // Create a new list
    list  := gomap.New(1, 2, 3, 4)
    mappable := gomap.MappableList{list}
    // The outcome.
    outcome := mappable.Map(transformer)
    
    // For predefined slices, we can use this flow:
    slice := []int{1, 2, 3, 4, 5}
    list = gomap.New(slice)
    mappable = gomap.MappableList{list}
    outcome := mappable.Map(transformer)
}
Boxed
import (
	"github.com/prequist/gomap"
	"github.com/prequist/ptypes"
)

func MakeBoxedAndConvert() []int {
	e := gomap.NewBoxed(1, 2, 3, 4, 5)
	mappable := gomap.MappableList{e}
	mappable.Map(func(v interface{}) interface{} {
		ib := v.(ptypes.Box).IntBox()
		return ptypes.FromInt(*ib.Int() + 2)
	})
	arr := make([]int, len(e.Items()))
	for index, vi := range e.Items() {
		arr[index] = *vi.(ptypes.Box).IntBox().Int()
	}
	return arr
}
Using interface{}s
import (
	"github.com/prequist/gomap"
	"github.com/prequist/ptypes"
)

func MakeAndConvert() []int {
	e := gomap.New(1, 2, 3, 4, 5)
	mappable := gomap.MappableList{e}
	mappable.Map(func(v interface{}) interface{} {
		return v.(int) + 1
	})
	arr := make([]int, len(e.Items()))
	for index, vi := range e.Items() {
		arr[index] = vi.(int)
	}
	return arr
}

Benchmarks

These are probably a bit bloat over time, however, they're not horrendous (compared to other) implementations.

On Mac OSX (Monterey, M1)

map_test.go

goos: darwin
goarch: arm64
pkg: github.com/prequist/gomap
BenchmarkPlain-8                12474228               100.0 ns/op
BenchmarkBox-8                    759380              1523 ns/op
BenchmarkString-8                4029303               277.8 ns/op
BenchmarkBoxedString-8            782708              1501 ns/op
BenchmarkAdd-8                  17820822                94.33 ns/op

iterator_test.go

BenchmarkIteratorNext-8         1000000000               0.5661 ns/op