diff --git a/_demo/async/async/async.go b/_demo/async/async/async.go new file mode 100644 index 00000000..8883ee58 --- /dev/null +++ b/_demo/async/async/async.go @@ -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 +} diff --git a/_demo/async/main.go b/_demo/async/main.go new file mode 100644 index 00000000..6bc63d82 --- /dev/null +++ b/_demo/async/main.go @@ -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{}) + })) +} diff --git a/_demo/async/timeout/timeout.go b/_demo/async/timeout/timeout.go new file mode 100644 index 00000000..20d632e7 --- /dev/null +++ b/_demo/async/timeout/timeout.go @@ -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{}) + }() + }) +}