v0.18.0-beta.1

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEYKH6faW/8Ivcu+eQO71Z6ZsoAwYFAmZeF/kACgkQO71Z6Zso
 AwaO9A//QPFidiC9OkGM282ztYyXgXv7HkwMKkMI9xHmOu3KFVATcUmbkhWyA8xP
 hACuySVnTvHRm/cscu8z3LZoH8f66lCloFGl/uixO9U6sIMHcYfui4QfDcDAMS2n
 +xQrfRHzAzVKelLaAD0xYavGTVw7Nsvbhg3no9wvmvqXn8gOmdhsfat0e0R9Mc2V
 Uaua1X3vfnRN1frNqbkWjNui2kPnmNhQ1ul8qOxirziDiMPZNqNTbqva+aNAt05e
 ik1DAVlaLOGi2YTSVj5yVgTQXiE8V3NppsN9qT8QE5+D8sjstSXoo6v8+Jc/qrRP
 8TyuTOSxVqcQR8LZyDUcr1/lWbDCPfy8icOYJJM4mgBXrMOIaa6veS97vUAQUrjk
 ODG6IU6VM6vfu+6POlhV0PGBzq316ygQOLdemuuS5PZMylUj7MoDkGmcQ8NC3ddw
 V3oMwswFi2dCk6yS9+4v23plN9QoPlzQPC6ovfm1R4E0qrQztbKTqKByVRAscxFg
 tdbDdKVkIeh0LyiRZ45lxOkXTUAxQgtxaUUPfNlfNYeFiHpg/AxedYXRvE0ZSfqJ
 oRwBMrEvv3DxDdb+rr0d8plSuk9M0X+sxTrBEbkyzm/rrrq0LRCsC8w2u0zoc0N7
 bVNsrWkR5QU0LzNgzbzbPB1bkW87BLT6YZ+SZ5+fsfZ/IGvw/6w=
 =s6RK
 -----END PGP SIGNATURE-----
 -----BEGIN OPENTIMESTAMPS GIT TIMESTAMP-----
 
 AQHwIHnpKQLJ2wejid7OynHym3mJfnPD6x2ngoPtcqt31tFRCP/wEGYhd2J+XYzn
 0EilLz1yGbwI8CAY/DIynHSPUmqlO6qMxSqWfsvLRxNnReNShTS+BbYDDgjwIJgP
 P9q9hYD//PPxTeeIP9XBS5NtZxbqXf7f/TMgya3jCPEEZl4X/vAIu0CtWafqxQEA
 g9/jDS75DI4uLWh0dHBzOi8vYWxpY2UuYnRjLmNhbGVuZGFyLm9wZW50aW1lc3Rh
 bXBzLm9yZ//wEHd3Q+vKQ/cRn8JvoPhmz2UI8SBtKVSPW3RHK2u3C6HV/cvwihPd
 Z33eNrgxYO5NXZ0l6AjxBGZeF/7wCNshzz/jyd5VAIPf4w0u+QyOKShodHRwczov
 L2Zpbm5leS5jYWxlbmRhci5ldGVybml0eXdhbGwuY29t//AQwA/Rlc87hPsa0gcO
 cAwUDgjxBGZeF/3wCPO6kLgOowodAIPf4w0u+QyOIyJodHRwczovL2J0Yy5jYWxl
 bmRhci5jYXRhbGxheHkuY29t8BDmmTRycV+Etw5lYf2ljYcuCPEEZl4X/vAI75Fv
 Mxq3Qb0Ag9/jDS75DI4sK2h0dHBzOi8vYm9iLmJ0Yy5jYWxlbmRhci5vcGVudGlt
 ZXN0YW1wcy5vcmc=
 -----END OPENTIMESTAMPS GIT TIMESTAMP-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEE9Pxw8HMQAoQk78IKjkJWWT8XdyAFAmZ8ctMACgkQjkJWWT8X
 dyD8PhAAzp53ZCfKRQoN3yBlFpfoqIiD3zQlrSE8gpNGjdP7nptxw+4w48283Hdn
 ZS17qHcFTdUgNYH+WMnX912IC+gG4BovGmjIW/jPt/phNLXGe7Hm+Zy6orRCkY6C
 OzZFwmKZNZ/KQ6W0JGdCWD+KMQarXRmHIsQLB06RAZn3885bfRomcZVLOoMpe73h
 va4XTHY6W0JRqAVmuyVGUU/w6gQ3PQTynJ45AxpD0FMrJyQnoJQAzzC8+5L+riwr
 L/t38/vRez0SuCkgiKak6h11X96SnV+7u0Mzh4iIBtyokq/XzEDtAn5pZRcNOCa/
 LvMPHg8saOifIVjopu4fesUvT00QmSpzQ0gS5bHke1YHcjMLpKsVl04GXINE+uWn
 FJ6DVOkz2ARvZhHakqeEhLNyTlagNhU64XNwGizhpKOS/Y63EOUMHgrb5hRzZdMr
 +8HO+e3x5VHmCjojKpkDzZCeBH4D8pMuUDSI51Jc4fMPF/i7cfESQfWNv3fGw04G
 xWwYxzBSTfjXXIfjDSfYuKaHdAu+cImNTD6fu7jHcFtt9vT0u7GU9Fz0BTiqQnwY
 uLJY7wUMH82H2o61ebqO+poRq+UsklmEebJrlOkj8YJW/GukrOm2rlZvSf9fOwWK
 nBVMw7HKRW3O8lwvTvTMREnT/ezKQx5Cp5ohvUSc7/Rzgp7Pz2s=
 =5oZg
 -----END PGP SIGNATURE-----

Merge tag 'v0.18.0-beta.1' into 0-19-staging

v0.18.0-beta.1
This commit is contained in:
Oliver Gugger 2024-06-26 21:57:59 +02:00
commit e8fddd3935
4 changed files with 158 additions and 1 deletions

View File

@ -47,7 +47,7 @@ const (
// AppPreRelease MUST only contain characters from semanticAlphabet per
// the semantic versioning spec.
AppPreRelease = "beta.rc3"
AppPreRelease = "beta"
)
func init() {

142
fn/result.go Normal file
View File

@ -0,0 +1,142 @@
package fn
import (
"fmt"
"testing"
)
// Result represents a value that can either be a success (T) or an error.
type Result[T any] struct {
Either[T, error]
}
// Ok creates a new Result with a success value.
func Ok[T any](val T) Result[T] {
return Result[T]{Either: NewLeft[T, error](val)}
}
// Err creates a new Result with an error.
func Err[T any](err error) Result[T] {
return Result[T]{Either: NewRight[T, error](err)}
}
// Errf creates a new Result with a new formatted error string.
func Errf[T any](errString string, args ...any) Result[T] {
return Result[T]{
Either: NewRight[T, error](fmt.Errorf(errString, args...)),
}
}
// Unpack extracts the value or error from the Result.
func (r Result[T]) Unpack() (T, error) {
var zero T
return r.left.UnwrapOr(zero), r.right.UnwrapOr(nil)
}
// IsOk returns true if the Result is a success value.
func (r Result[T]) IsOk() bool {
return r.IsLeft()
}
// IsErr returns true if the Result is an error.
func (r Result[T]) IsErr() bool {
return r.IsRight()
}
// Map applies a function to the success value if it exists.
func (r Result[T]) Map(f func(T) T) Result[T] {
if r.IsOk() {
return Ok(f(r.left.some))
}
return r
}
// MapErr applies a function to the error value if it exists.
func (r Result[T]) MapErr(f func(error) error) Result[T] {
if r.IsErr() {
return Err[T](f(r.right.some))
}
return r
}
// Option returns the success value as an Option.
func (r Result[T]) Option() Option[T] {
return r.left
}
// WhenResult executes the given function if the Result is a success.
func (r Result[T]) WhenResult(f func(T)) {
r.left.WhenSome(func(t T) {
f(t)
})
}
// WhenErr executes the given function if the Result is an error.
func (r Result[T]) WhenErr(f func(error)) {
r.right.WhenSome(func(e error) {
f(e)
})
}
// UnwrapOr returns the success value or a default value if it's an error.
func (r Result[T]) UnwrapOr(defaultValue T) T {
return r.left.UnwrapOr(defaultValue)
}
// UnwrapOrElse returns the success value or computes a value from a function
// if it's an error.
func (r Result[T]) UnwrapOrElse(f func() T) T {
return r.left.UnwrapOrFunc(f)
}
// UnwrapOrFail returns the success value or fails the test if it's an error.
func (r Result[T]) UnwrapOrFail(t *testing.T) T {
t.Helper()
return r.left.UnwrapOrFail(t)
}
// FlatMap applies a function that returns a Result to the success value if it
// exists.
func (r Result[T]) FlatMap(f func(T) Result[T]) Result[T] {
if r.IsOk() {
return f(r.left.some)
}
return r
}
// AndThen is an alias for FlatMap. This along with OrElse can be used to
// Railway Oriented Programming (ROP) by chaining successive computational
// operations from a single result type.
func (r Result[T]) AndThen(f func(T) Result[T]) Result[T] {
return r.FlatMap(f)
}
// OrElse returns the original Result if it is a success, otherwise it returns
// the provided alternative Result. This along with AndThen can be used to
// Railway Oriented Programming (ROP).
func (r Result[T]) OrElse(f func() Result[T]) Result[T] {
if r.IsOk() {
return r
}
return f()
}
// FlatMap applies a function that returns a Result[B] to the success value if
// it exists.
func FlatMap[A, B any](r Result[A], f func(A) Result[B]) Result[B] {
if r.IsOk() {
return f(r.left.some)
}
return Err[B](r.right.some)
}
// AndThen is an alias for FlatMap. This along with OrElse can be used to
// Railway Oriented Programming (ROP).
func AndThen[A, B any](r Result[A], f func(A) Result[B]) Result[B] {
return FlatMap(r, f)
}

View File

@ -0,0 +1,14 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZlZ1MRYJKwYBBAHaRw8BAQdAZsa54hBDrjAnuj56IGJYcIszHvasEPFVvcO9
3WBUS3q0L0tlYWdhbiBNY0NsZWxsYW5kIDxrZWFnYW4ubWNjbGVsbGFuZEBnbWFp
bC5jb20+iJkEExYKAEEWIQRSlaR3/8gGTXBXsZH6fmXJUfEkOQUCZlZ1MQIbAwUJ
BaOagAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRD6fmXJUfEkOU1fAQDW
wdx8AF8QdITRvY299R6Y9348N4EIa9mq6bYeh+d0HwD7BPEkKquPNncuUmqJ8EAe
uGOQX0xs+0YyynMIHulnnQi4OARmVnUxEgorBgEEAZdVAQUBAQdAOvF6kho3KmjN
OQQX/bxng+Tgy4hz34BJojWJdSpn/gYDAQgHiH4EGBYKACYWIQRSlaR3/8gGTXBX
sZH6fmXJUfEkOQUCZlZ1MQIbDAUJBaOagAAKCRD6fmXJUfEkOaVeAP4rJD+kvC0D
jffwmx9w0L6Grb4KPX1FTm7UBq7JSZExHgEAn27BOcf4lDoRZRa27K6jjTNd96Nk
2MU5hr1pnbZNfQQ=
=3tMW
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -33,6 +33,7 @@ KEYS+=("4DC235556B18694E08518DBB671103D881A5F0E4 sputn1ck")
KEYS+=("187F6ADD93AE3B0CF335AA6AB984570980684DCC ViktorTigerstrom")
KEYS+=("E85497D2DBA0EB9ADB0024279BCD95C4FF296868 yyforyongyu")
KEYS+=("32F7EA1E7A0339F7D37164B9F82D456EA023C9BF hieblmi")
KEYS+=("5295A477FFC8064D7057B191FA7E65C951F12439 proofofkeags")
TEMP_DIR=$(mktemp -d /tmp/lnd-sig-verification-XXXXXX)