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  }