/
overlay.go
88 lines (77 loc) · 1.26 KB
/
overlay.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package li
import "sync/atomic"
type Overlay struct {
ID ID
Element Element
KeyStrokeHandler KeyStrokeHandler
}
func (_ Provide) DefaultOverlays() []Overlay {
return nil
}
var overlayID int64
type OverlayObject any
type PushOverlay func(
obj OverlayObject,
) (
id ID,
)
func (_ Provide) PushOverlay(
run RunInMainLoop,
) PushOverlay {
return func(
obj OverlayObject,
) (
id ID,
) {
id = ID(atomic.AddInt64(&overlayID, 1))
overlay := Overlay{
ID: id,
}
if elem, ok := obj.(Element); ok {
overlay.Element = elem
}
if handler, ok := obj.(KeyStrokeHandler); ok {
overlay.KeyStrokeHandler = handler
}
run(func(
scope Scope,
overlays []Overlay,
derive Derive,
) {
overlays = append(overlays, overlay)
derive(
func() []Overlay {
return overlays
},
)
})
return
}
}
type CloseOverlay func(
id ID,
)
func (_ Provide) CloseOverlay(
run RunInMainLoop,
) CloseOverlay {
return func(
id ID,
) {
run(func(
scope Scope,
overlays []Overlay,
derive Derive,
) {
for i := 0; i < len(overlays); i++ {
if overlays[i].ID == id {
overlays = append(overlays[:i], overlays[i+1:]...)
}
}
derive(
func() []Overlay {
return overlays
},
)
})
}
}