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

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