cbind.BindF

This commit is contained in:
Li Jie
2024-09-05 10:23:31 +08:00
parent 276f2070ee
commit 6e0a9b2b48
2 changed files with 41 additions and 13 deletions

View File

@@ -29,7 +29,7 @@ import (
func Timeout(d time.Duration) async.IO[async.Void] { func Timeout(d time.Duration) async.IO[async.Void] {
return async.Async(func(resolve func(async.Void)) { return async.Async(func(resolve func(async.Void)) {
t, _ := cbind.Bind[libuv.Timer](func() { t, _ := cbind.BindF[libuv.Timer, libuv.TimerCb](func() {
resolve(async.Void{}) resolve(async.Void{})
}) })
r := libuv.InitTimer(async.Exec().L, t) r := libuv.InitTimer(async.Exec().L, t)

View File

@@ -97,30 +97,58 @@ func Callback3[Base any, A any, B any, C any](b *Base, a A, c B, d C) {
* @param call The Go function to bind. * @param call The Go function to bind.
* @return The data pointer and the C callback function. * @return The data pointer and the C callback function.
*/ */
func Bind[T any](call func()) (p *T, fn Cb[T]) { func Bind[T any](call func()) (p *T, cb Cb[T]) {
bb := &bind[T]{fn: func() { call() }} bb := &bind[T]{fn: call}
p = (*T)(unsafe.Pointer(bb)) p = (*T)(unsafe.Pointer(bb))
fn = Callback[T] cb = Callback[T]
return return
} }
func Bind1[T any, A any](call func(A)) (p *T, fn Cb1[T, A]) { func BindF[T any, F ~func(*T)](call func()) (*T, F) {
bb := &bind1[T, A]{fn: func(a A) { call(a) }} bb := &bind[T]{fn: call}
p := (*T)(unsafe.Pointer(bb))
fn := Callback[T]
return p, *(*F)(unsafe.Pointer(&fn))
}
func Bind1[T any, A any](call func(A)) (p *T, cb Cb1[T, A]) {
bb := &bind1[T, A]{fn: call}
p = (*T)(unsafe.Pointer(bb)) p = (*T)(unsafe.Pointer(bb))
fn = Callback1[T, A] cb = Callback1[T, A]
return return
} }
func Bind2[T any, A any, B any](call func(A, B)) (p *T, fn Cb2[T, A, B]) { func Bind1F[T any, A any, F ~func(A)](call func(A)) (*T, F) {
bb := &bind2[T, A, B]{fn: func(a A, b B) { call(a, b) }} bb := &bind1[T, A]{fn: call}
p := (*T)(unsafe.Pointer(bb))
fn := Callback1[T, A]
return p, *(*F)(unsafe.Pointer(&fn))
}
func Bind2[T any, A any, B any](call func(A, B)) (p *T, cb Cb2[T, A, B]) {
bb := &bind2[T, A, B]{fn: call}
p = (*T)(unsafe.Pointer(bb)) p = (*T)(unsafe.Pointer(bb))
fn = Callback2[T, A, B] cb = Callback2[T, A, B]
return return
} }
func Bind3[T any, A any, B any, C any](call func(A, B, C), a A, b B, c C) (p *T, fn Cb3[T, A, B, C]) { func Bind2F[T any, A any, B any, F ~func(A, B)](call func(A, B)) (*T, F) {
bb := &bind3[T, A, B, C]{fn: func(a A, b B, c C) { call(a, b, c) }} bb := &bind2[T, A, B]{fn: call}
p := (*T)(unsafe.Pointer(bb))
fn := Callback2[T, A, B]
return p, *(*F)(unsafe.Pointer(&fn))
}
func Bind3[T any, A any, B any, C any](call func(A, B, C), a A, b B, c C) (p *T, cb Cb3[T, A, B, C]) {
bb := &bind3[T, A, B, C]{fn: call}
p = (*T)(unsafe.Pointer(bb)) p = (*T)(unsafe.Pointer(bb))
fn = Callback3[T, A, B, C] cb = Callback3[T, A, B, C]
return return
} }
func Bind3F[T any, A any, B any, C any, F ~func(A, B, C)](call func(A, B, C), a A, b B, c C) (*T, F) {
bb := &bind3[T, A, B, C]{fn: call}
p := (*T)(unsafe.Pointer(bb))
fn := Callback3[T, A, B, C]
return p, *(*F)(unsafe.Pointer(&fn))
}