11package lister
22
33import (
4- "github.com/joshmedeski/sesh/v2/model"
54 "slices"
5+ "sync"
6+
7+ "github.com/joshmedeski/sesh/v2/model"
68)
79
810type (
@@ -19,6 +21,12 @@ type (
1921 srcStrategy func (* RealLister ) (model.SeshSessions , error )
2022)
2123
24+ type strategyResult struct {
25+ source string
26+ sessions model.SeshSessions
27+ err error
28+ }
29+
2230var srcStrategies = map [string ]srcStrategy {
2331 "tmux" : listTmux ,
2432 "config" : listConfig ,
@@ -33,11 +41,32 @@ func (l *RealLister) List(opts ListOptions) (model.SeshSessions, error) {
3341 srcsOrderedIndex := srcs (opts )
3442 srcsOrderedIndex = sortSources (srcsOrderedIndex , l .config .SortOrder )
3543
44+ resultsChan := make (chan strategyResult , len (srcsOrderedIndex ))
45+ var wg sync.WaitGroup
46+
3647 for _ , src := range srcsOrderedIndex {
37- sessions , err := srcStrategies [src ](l )
38- if err != nil {
39- return model.SeshSessions {}, err
48+ wg .Add (1 )
49+ go func (s string ) {
50+ defer wg .Done ()
51+ sessions , err := srcStrategies [s ](l )
52+ resultsChan <- strategyResult {source : s , sessions : sessions , err : err }
53+ }(src )
54+ }
55+
56+ wg .Wait ()
57+ close (resultsChan )
58+
59+ // Collect results into a map for easy lookup
60+ resultsMap := make (map [string ]model.SeshSessions )
61+ for res := range resultsChan {
62+ if res .err != nil {
63+ return model.SeshSessions {}, res .err
4064 }
65+ resultsMap [res .source ] = res .sessions
66+ }
67+
68+ for _ , src := range srcsOrderedIndex {
69+ sessions := resultsMap [src ]
4170 fullOrderedIndex = append (fullOrderedIndex , sessions .OrderedIndex ... )
4271 for _ , i := range sessions .OrderedIndex {
4372 fullDirectory [i ] = sessions .Directory [i ]
0 commit comments