Skip to content

Commit 0e4b8f6

Browse files
refactor: populate segments in parallel
1 parent e521355 commit 0e4b8f6

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

engine.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"fmt"
5+
"sync"
56
)
67

78
type engine struct {
@@ -83,20 +84,16 @@ func (e *engine) renderSegmentText(text string) {
8384
func (e *engine) renderBlockSegments(block *Block) string {
8485
defer e.reset()
8586
e.activeBlock = block
86-
cwd := e.env.getcwd()
87+
e.setStringValues(block.Segments)
8788
for _, segment := range block.Segments {
88-
if segment.hasValue(IgnoreFolders, cwd) {
89-
continue
90-
}
91-
props, err := segment.mapSegmentWithWriter(e.env)
92-
if err != nil || !segment.enabled() {
89+
if !segment.active {
9390
continue
9491
}
9592
e.activeSegment = segment
9693
e.endPowerline()
9794
text := segment.string()
98-
e.activeSegment.Background = props.background
99-
e.activeSegment.Foreground = props.foreground
95+
e.activeSegment.Background = segment.props.background
96+
e.activeSegment.Foreground = segment.props.foreground
10097
e.renderSegmentText(text)
10198
}
10299
if e.previousActiveSegment != nil && e.previousActiveSegment.Style == Powerline {
@@ -105,6 +102,22 @@ func (e *engine) renderBlockSegments(block *Block) string {
105102
return e.renderer.string()
106103
}
107104

105+
func (e *engine) setStringValues(segments []*Segment) {
106+
wg := sync.WaitGroup{}
107+
wg.Add(len(segments))
108+
defer wg.Wait()
109+
cwd := e.env.getcwd()
110+
for _, segment := range segments {
111+
go func(s *Segment) {
112+
defer wg.Done()
113+
err := s.mapSegmentWithWriter(e.env)
114+
if err == nil && !s.hasValue(IgnoreFolders, cwd) && s.enabled() {
115+
s.stringValue = s.string()
116+
}
117+
}(segment)
118+
}
119+
}
120+
108121
func (e *engine) render() {
109122
for _, block := range e.settings.Blocks {
110123
// if line break, append a line break

segment.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ type Segment struct {
1313
LeadingDiamond string `json:"leading_diamond"`
1414
TrailingDiamond string `json:"trailing_diamond"`
1515
Properties map[Property]interface{} `json:"properties"`
16+
props *properties
1617
writer SegmentWriter
18+
stringValue string
19+
active bool
1720
}
1821

1922
//SegmentWriter is the interface used to define what and if to write to the prompt
@@ -73,7 +76,8 @@ func (segment *Segment) string() string {
7376
}
7477

7578
func (segment *Segment) enabled() bool {
76-
return segment.writer.enabled()
79+
segment.active = segment.writer.enabled()
80+
return segment.active
7781
}
7882

7983
func (segment *Segment) getValue(property Property, defaultValue string) string {
@@ -96,7 +100,7 @@ func (segment *Segment) hasValue(property Property, match string) bool {
96100
return false
97101
}
98102

99-
func (segment *Segment) mapSegmentWithWriter(env environmentInfo) (*properties, error) {
103+
func (segment *Segment) mapSegmentWithWriter(env environmentInfo) error {
100104
functions := map[SegmentType]SegmentWriter{
101105
Session: &session{},
102106
Path: &path{},
@@ -122,7 +126,8 @@ func (segment *Segment) mapSegmentWithWriter(env environmentInfo) (*properties,
122126
}
123127
writer.init(props, env)
124128
segment.writer = writer
125-
return props, nil
129+
segment.props = props
130+
return nil
126131
}
127-
return nil, errors.New("Unable to map writer")
132+
return errors.New("Unable to map writer")
128133
}

segment_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ func TestMapSegmentWriterCanMap(t *testing.T) {
1212
Type: Session,
1313
}
1414
env := new(MockedEnvironment)
15-
props, err := sc.mapSegmentWithWriter(env)
16-
assert.NotNil(t, props)
15+
err := sc.mapSegmentWithWriter(env)
16+
assert.NotNil(t, sc.props)
1717
assert.NoError(t, err)
1818
assert.NotNil(t, sc.writer)
1919
}
@@ -23,8 +23,8 @@ func TestMapSegmentWriterCannotMap(t *testing.T) {
2323
Type: "nilwriter",
2424
}
2525
env := new(MockedEnvironment)
26-
props, err := sc.mapSegmentWithWriter(env)
27-
assert.Nil(t, props)
26+
err := sc.mapSegmentWithWriter(env)
27+
assert.Nil(t, sc.props)
2828
assert.Error(t, err)
2929
}
3030

0 commit comments

Comments
 (0)