Skip to content

Instantly share code, notes, and snippets.

View koonix's full-sized avatar
🦆
honk

koonix

🦆
honk
View GitHub Profile
@koonix
koonix / subsets.go
Last active October 6, 2024 17:35
Go function that returns the subsets of a slice.
func subsets[T any](v []T) [][]T {
switch len(v) {
case 0:
return [][]T{
{},
}
case 1:
return [][]T{
{v[0]},
{},
@koonix
koonix / permute.go
Last active October 6, 2024 17:32
Go function that returns the permutations of a slice.
func permute[T any](v []T) [][]T {
switch len(v) {
case 0:
return [][]T{
{},
}
case 1:
return [][]T{
{v[0]},
}
@koonix
koonix / nuclear.go
Last active October 5, 2024 17:33
Nuclear atomically stores values. The closest thing to this in the stdlib is atomic.Pointer.
package nuke
import "sync"
type Nuclear[T any] struct {
mu sync.RWMutex
v T
}
func (n *Nuclear[T]) Store(v T) {
@koonix
koonix / once.go
Created September 27, 2024 23:04
Go object that stores a value only once
package once
import "sync"
type Once[T any] struct {
sync.Mutex
has bool
v T
}
@koonix
koonix / withcloser_reader.go
Last active September 18, 2024 17:30
Go package that adds Close to Reader/Writer
package withcloser
import "io"
type reader struct {
io.Reader
close func() error
}
func (r reader) Close() error {
@koonix
koonix / addlicense.sh
Created September 5, 2024 12:33
Add license headers to source files. This example adds the Apache header to Golang files.
#!/bin/bash
set -eu -o pipefail
# This script ensures source code files
# have copyright license headers.
#
# It modifies all source files in place
# and avoids adding a license header
# to any file that already has one.
@koonix
koonix / seen.go
Created September 2, 2024 16:12
Go unique value tester.
package seen
type Seen[T comparable] struct {
Map map[T]struct{}
}
func New[T comparable](size int) Seen[T] {
return Seen[T]{
Map: make(map[T]struct{}, size),
}
@koonix
koonix / random_bytes.go
Last active September 18, 2024 15:08
Go random byte generator
func RandomBytes(length int) []byte {
const charset = "abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\t\n "
b := make([]byte, length)
for i := range b {
b[i] = charset[rand.Intn(len(charset))]
}
return b
}
@koonix
koonix / random_string.go
Last active September 18, 2024 15:08
Go random string generator
package rndstr
import (
"crypto/rand"
"encoding/base64"
)
func RndStr(n int) (string, error) {
rnd := make([]byte, n + 10)
_, err := rand.Read(rnd)
@koonix
koonix / surfboard.sh
Created September 10, 2022 22:00
like surfraw, but not a million fucking lines long.
#!/bin/bash
# like surfraw, but not a million fucking lines long.
# requires dmenu.
# the default search engine is shown at first.
# to select another search engine, press enter when
# the prompt is empty in dmenu.
# name of the default search engine
default='Searx'