github.com/alkemics/goflow@v0.2.1/wrappers/bind/graph/bind.go (about) 1 // Code generated by goflow DO NOT EDIT. 2 3 //go:build !codeanalysis 4 // +build !codeanalysis 5 6 package main 7 8 import ( 9 "github.com/alkemics/goflow/example/constants/functions" 10 "github.com/alkemics/goflow/example/nodes" 11 ) 12 13 /* 14 15 */ 16 type Bind struct{} 17 18 func NewBind() Bind { 19 return Bind{} 20 } 21 22 func newBind(id string) Bind { 23 return Bind{} 24 } 25 26 /* 27 28 */ 29 func (g *Bind) Run() { 30 31 // __add_reducer outputs 32 var __add_reducer_aggregated functions.IntReducer 33 34 // __print_values outputs 35 var __print_values_aggregated []interface{} 36 37 // add outputs 38 var add_result int 39 40 // make_slice outputs 41 var make_slice_list []int 42 43 // print outputs 44 45 igniteNodeID := "ignite" 46 doneNodeID := "done" 47 48 done := make(chan string) 49 defer close(done) 50 51 steps := map[string]struct { 52 deps map[string]struct{} 53 run func() 54 alreadyDone bool 55 }{ 56 57 "__add_reducer": { 58 deps: map[string]struct{}{ 59 igniteNodeID: {}, 60 }, 61 run: func() { 62 __add_reducer_aggregated = functions.IntSum 63 done <- "__add_reducer" 64 }, 65 alreadyDone: false, 66 }, 67 "__print_values": { 68 deps: map[string]struct{}{ 69 "make_slice": {}, 70 "add": {}, 71 igniteNodeID: {}, 72 }, 73 run: func() { 74 __print_values_aggregated = append(__print_values_aggregated, "should print 1, 2, 3 and 0") 75 for _, e := range make_slice_list { 76 __print_values_aggregated = append(__print_values_aggregated, e) 77 } 78 __print_values_aggregated = append(__print_values_aggregated, add_result) 79 done <- "__print_values" 80 }, 81 alreadyDone: false, 82 }, 83 "add": { 84 deps: map[string]struct{}{ 85 "__add_reducer": {}, 86 igniteNodeID: {}, 87 }, 88 run: func() { 89 var list []int 90 add_result = nodes.IntAggregator(list, __add_reducer_aggregated) 91 done <- "add" 92 }, 93 alreadyDone: false, 94 }, 95 "make_slice": { 96 deps: map[string]struct{}{ 97 igniteNodeID: {}, 98 }, 99 run: func() { 100 make_slice_list = nodes.SliceMaker() 101 done <- "make_slice" 102 }, 103 alreadyDone: false, 104 }, 105 "print": { 106 deps: map[string]struct{}{ 107 "__print_values": {}, 108 igniteNodeID: {}, 109 }, 110 run: func() { 111 nodes.Printer(__print_values_aggregated) 112 done <- "print" 113 }, 114 alreadyDone: false, 115 }, 116 igniteNodeID: { 117 deps: map[string]struct{}{}, 118 run: func() { 119 done <- igniteNodeID 120 }, 121 alreadyDone: false, 122 }, 123 doneNodeID: { 124 deps: map[string]struct{}{ 125 "__add_reducer": {}, 126 "__print_values": {}, 127 "add": {}, 128 "make_slice": {}, 129 "print": {}, 130 }, 131 run: func() { 132 done <- doneNodeID 133 }, 134 alreadyDone: false, 135 }, 136 } 137 138 // Ignite 139 ignite := steps[igniteNodeID] 140 ignite.alreadyDone = true 141 steps[igniteNodeID] = ignite 142 go steps[igniteNodeID].run() 143 144 // Resolve the graph 145 for resolved := range done { 146 if resolved == doneNodeID { 147 // If all the graph was resolved, get out of the loop 148 break 149 } 150 151 for name, step := range steps { 152 delete(step.deps, resolved) 153 if len(step.deps) == 0 && !step.alreadyDone { 154 step.alreadyDone = true 155 steps[name] = step 156 go step.run() 157 } 158 } 159 } 160 161 return 162 }