( first: ThreadGenerator | boolean, ...tasks: ThreadGenerator[] )
| 41 | ...tasks: ThreadGenerator[] |
| 42 | ): ThreadGenerator; |
| 43 | export function* join( |
| 44 | first: ThreadGenerator | boolean, |
| 45 | ...tasks: ThreadGenerator[] |
| 46 | ): ThreadGenerator { |
| 47 | let all = true; |
| 48 | if (typeof first === 'boolean') { |
| 49 | all = first; |
| 50 | } else { |
| 51 | tasks.push(first); |
| 52 | } |
| 53 | |
| 54 | const parent = useThread(); |
| 55 | const threads = <Thread[]>( |
| 56 | tasks |
| 57 | .map(task => parent.children.find(thread => thread.runner === task)) |
| 58 | .filter(thread => thread) |
| 59 | ); |
| 60 | |
| 61 | const startTime = parent.time(); |
| 62 | let childTime; |
| 63 | if (all) { |
| 64 | while (threads.find(thread => !thread.canceled)) { |
| 65 | yield; |
| 66 | } |
| 67 | childTime = Math.max(...threads.map(thread => thread.time())); |
| 68 | } else { |
| 69 | while (!threads.find(thread => thread.canceled)) { |
| 70 | yield; |
| 71 | } |
| 72 | const canceled = threads.filter(thread => thread.canceled); |
| 73 | childTime = Math.min(...canceled.map(thread => thread.time())); |
| 74 | } |
| 75 | |
| 76 | parent.time(Math.max(startTime, childTime)); |
| 77 | } |
no test coverage detected