Skip to content

Commit

Permalink
refactor: add promises
Browse files Browse the repository at this point in the history
  • Loading branch information
markthree committed Aug 19, 2023
1 parent 9493fdd commit 3cb796f
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 18 deletions.
65 changes: 47 additions & 18 deletions src/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,35 @@ import (

type EntrySizeChan chan int64

func ValuePromise[T any](ch chan T) (func(T), func() T) {
resolve := func(result T) {
ch <- result
}
value := func() T {
return <-ch
}
return resolve, value
}

func StatusPromise[T any](ch chan T, err chan error) (func(T), func(error), func() (T, error)) {
resolve := func(result T) {
ch <- result
}
reject := func(errValue error) {
err <- errValue
}
status := func() (T, error) {
select {
case value := <-ch:
return value, nil
case errValue := <-err:
var zero T
return zero, errValue
}
}
return resolve, reject, status
}

func Invoke(folder string) (size int64, e error) {
gracefulExit := func(err error) {
e = err
Expand All @@ -26,40 +55,39 @@ func Invoke(folder string) (size int64, e error) {
}
errChan := make(chan error)
sizeChan := make(EntrySizeChan, entrysLen)

resolve, reject, status := StatusPromise(sizeChan, errChan)

for i := 0; i < entrysLen; i++ {
go func(entry fs.DirEntry) {
if entry.IsDir() {
subFolderSize, err := Invoke(path.Join(folder, entry.Name()))
if err != nil {
gracefulExit(err)
errChan <- err
reject(err)
return
}
sizeChan <- subFolderSize
resolve(subFolderSize)
return
}

info, err := entry.Info()
if err != nil {
gracefulExit(err)
errChan <- err
reject(err)
return
}
sizeChan <- info.Size()
resolve(info.Size())
}(entrys[i])
}

for i := 0; i < entrysLen; i++ {
select {
case nestedErr := <-errChan:
gracefulExit(nestedErr)
newSize, newErr := status()
if newErr != nil {
gracefulExit(newErr)
return
case nestedSize := <-sizeChan:
size += nestedSize
}
size += newSize
}

return size, e
return size, nil
}

func LooseInvoke(folder string) int64 {
Expand All @@ -74,24 +102,25 @@ func LooseInvoke(folder string) int64 {
return 0
}
sizeChan := make(EntrySizeChan, entrysLen)
resolve, value := ValuePromise(sizeChan)

for i := 0; i < entrysLen; i++ {
go func(entry fs.DirEntry) {
if entry.IsDir() {
subFolderSize := LooseInvoke(path.Join(folder, entry.Name()))
sizeChan <- subFolderSize
resolve(subFolderSize)
return
}
info, err := entry.Info()
if err != nil {
sizeChan <- 0
resolve(0)
return
}
sizeChan <- info.Size()
resolve(info.Size())
}(entrys[i])
}

for i := 0; i < entrysLen; i++ {
size += <-sizeChan
size += value()
}
return size
}
Binary file modified wasm/main.wasm
Binary file not shown.

0 comments on commit 3cb796f

Please sign in to comment.