-
Notifications
You must be signed in to change notification settings - Fork 1
/
axis.go
59 lines (53 loc) · 1.54 KB
/
axis.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
package miruken
type (
// HandlerAxis extends Handler with traversal behavior.
HandlerAxis interface {
Handler
HandleAxis(
axis TraversingAxis,
callback any,
greedy bool,
composer Handler,
) HandleResult
}
// axisScope applies axis traversal to a Handler.
axisScope struct {
HandlerAxis
axis TraversingAxis
}
)
func (a *axisScope) Handle(
callback any,
greedy bool,
composer Handler,
) HandleResult {
if composer == nil {
composer = &CompositionScope{a}
}
if _, ok := callback.(*Composition); ok {
return a.HandlerAxis.Handle(callback, greedy, composer)
}
return a.HandlerAxis.HandleAxis(a.axis, callback, greedy, composer)
}
func Axis(axis TraversingAxis) BuilderFunc {
return func(handler Handler) Handler {
if axisHandler, ok := handler.(HandlerAxis); ok {
return &axisScope{axisHandler, axis}
}
return handler
}
}
var SelfAxis = Axis(TraverseSelf)
var RootAxis = Axis(TraverseRoot)
var ChildAxis = Axis(TraverseChild)
var SiblingAxis = Axis(TraverseSibling)
var AncestorAxis = Axis(TraverseAncestor)
var DescendantAxis = Axis(TraverseDescendant)
var DescendantReverseAxis = Axis(TraverseDescendantReverse)
var SelfOrChildAxis = Axis(TraverseSelfOrChild)
var SelfOrSiblingAxis = Axis(TraverseSelfOrSibling)
var SelfOrAncestorAxis = Axis(TraverseSelfOrAncestor)
var SelfOrDescendantAxis = Axis(TraverseSelfOrDescendant)
var SelfOrDescendantReverseAxis = Axis(TraverseSelfOrDescendant)
var SelfSiblingOrAncestorAxis = Axis(TraverseSelfSiblingOrAncestor)
var Publish = ComposeBuilders(SelfOrDescendantAxis, Notify)