ssa: cache types named in runtime
This commit is contained in:
31
_demo/async/async/async.go
Normal file
31
_demo/async/async/async.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package async
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Void = [0]byte
|
||||||
|
|
||||||
|
type Future[T any] interface {
|
||||||
|
Then(cb func(T))
|
||||||
|
}
|
||||||
|
|
||||||
|
type future[T any] struct {
|
||||||
|
cb func(func(T))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *future[T]) Then(cb func(T)) {
|
||||||
|
f.cb(cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Async[T any](fn func(func(T))) Future[T] {
|
||||||
|
return &future[T]{fn}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run[T any](future Future[T]) T {
|
||||||
|
var ret T
|
||||||
|
future.Then(func(v T) {
|
||||||
|
ret = v
|
||||||
|
})
|
||||||
|
return ret
|
||||||
|
}
|
||||||
23
_demo/async/main.go
Normal file
23
_demo/async/main.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/_demo/async/async"
|
||||||
|
"github.com/goplus/llgo/_demo/async/timeout"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Sleep(i int, d time.Duration) async.Future[int] {
|
||||||
|
return async.Async(func(resolve func(int)) {
|
||||||
|
timeout.Timeout(d).Then(func(async.Void) {
|
||||||
|
resolve(i)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
async.Run(async.Async(func(resolve func(async.Void)) {
|
||||||
|
println("read file")
|
||||||
|
defer resolve(async.Void{})
|
||||||
|
}))
|
||||||
|
}
|
||||||
16
_demo/async/timeout/timeout.go
Normal file
16
_demo/async/timeout/timeout.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package timeout
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/_demo/async/async"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Timeout(d time.Duration) async.Future[async.Void] {
|
||||||
|
return async.Async(func(resolve func(async.Void)) {
|
||||||
|
go func() {
|
||||||
|
time.Sleep(d)
|
||||||
|
resolve(async.Void{})
|
||||||
|
}()
|
||||||
|
})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user