github.com/packtpublishing/learning-functional-programming-in-go@v0.0.0-20230130084745-8b849f6d58c4/Chapter08/04_buffered_cpus/ex1.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	gc "github.com/go-goodies/go_currency"
     6  	"runtime"
     7  )
     8  
     9  func main() {
    10  	orders := GetOrders()
    11  	numberOfOrders := len(orders)
    12  	cpus := runtime.NumCPU()
    13  	runtime.GOMAXPROCS(cpus)
    14  	input := make(chan Order, cpus)
    15  	output := make(chan Order, cpus)
    16  	for i := 0; i < numberOfOrders; i++ {
    17  		go func() {
    18  			for order := range input {
    19  				output <- Pipeline(order)
    20  			}
    21  		}()
    22  	}
    23  	for _, order := range orders {
    24  		input <- *order
    25  	}
    26  	close(input)
    27  	for i := 0; i < numberOfOrders; i++ {
    28  		fmt.Println("The result is:", <-output)
    29  	}
    30  }
    31  
    32  
    33  // close the input channel so start() will exit and can clean up after
    34  // itself if it so wishes.
    35  
    36  func Pipeline(o Order) Order {
    37  	o = Authenticate(o)
    38  	o = Decrypt(o)
    39  	o = Charge(o)
    40  	return o
    41  }
    42  
    43  
    44  func Authenticate(o Order) Order  {
    45  	fmt.Printf("Order %d is Authenticated\n", o.OrderNumber)
    46  	return o
    47  }
    48  
    49  func Decrypt(o Order) Order {
    50  	fmt.Printf("Order %d is Decrypted\n", o.OrderNumber)
    51  	return o
    52  }
    53  
    54  func Charge(o Order) Order {
    55  	fmt.Printf("Order %d is Charged\n", o.OrderNumber)
    56  	return o
    57  }
    58  
    59  
    60  
    61  type Order struct {
    62  	OrderNumber int
    63  	IsValid bool
    64  	Credentials string
    65  	CCardNumber string
    66  	CCardExpDate string
    67  	LineItems []LineItem
    68  }
    69  
    70  type LineItem struct {
    71  	Description string
    72  	Count       int
    73  	PriceUSD    gc.USD
    74  }
    75  func GetOrders() []*Order {
    76  
    77  	order1 := &Order{
    78  		10001,
    79  		true,
    80  		"alice,secret",
    81  		"7b/HWvtIB9a16AYk+Yv6WWwer3GFbxpjoR+GO9iHIYY=",
    82  		"0922",
    83  		[]LineItem{
    84  			LineItem{"Apples", 1, gc.USD{4, 50}},
    85  			LineItem{"Oranges", 4, gc.USD{12, 00}},
    86  		},
    87  	}
    88  
    89  	order2 := &Order{
    90  		10002,
    91  		true,
    92  		"bob,secret",
    93  		"EOc3kF/OmxY+dRCaYRrey8h24QoGzVU0/T2QKVCHb1Q=",
    94  		"0123",
    95  		[]LineItem{
    96  			LineItem{"Milk", 2, gc.USD{8, 00}},
    97  			LineItem{"Sugar", 1, gc.USD{2, 25}},
    98  			LineItem{"Salt", 3, gc.USD{3, 75}},
    99  		},
   100  	}
   101  	orders := []*Order{order1, order2}
   102  	return orders
   103  }