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