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