// Package varint is a variable integer encoding with terminal byte having 8th bit set. package varint import ( "io" "smesh.lol/pkg/lol/chk" ) type Integer interface { ~int | ~int8 | ~int16 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint64 } func Encode[V Integer](w io.Writer, v V) { x := []byte{0} for { x[0] = byte(v) & 127 v >>= 7 if v == 0 { x[0] |= 128 _, _ = w.Write(x) break } else { _, _ = w.Write(x) } } } func Decode(r io.Reader) (v uint64, err error) { x := []byte{0} v += uint64(x[0]) var i uint64 for { if _, err = r.Read(x); chk.E(err) { return } if x[0] >= 128 { v += uint64(x[0]&127) << (i * 7) return } else { v += uint64(x[0]) << (i * 7) i++ } } }