package sort import ( "codeberg.org/snonux/algorithms/ds" "sync" "time" ) func Sleep[V ds.Integer](a ds.ArrayList[V]) ds.ArrayList[V] { // Start empty with capacity len(a): the received values are appended below. // NewArrayList(len(a)) would create a slice of that *length* (all zeros) and // the appends would then produce len(a) spurious leading zeros. sorted := make(ds.ArrayList[V], 0, len(a)) numCh := make(chan V) var wg sync.WaitGroup wg.Add(len(a)) go func() { wg.Wait() close(numCh) }() for _, num := range a { go func(num V) { defer wg.Done() time.Sleep(time.Duration(num) * time.Second) numCh <- num }(num) } for num := range numCh { sorted = append(sorted, num) } return sorted }