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 }