github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/3-functional-techniques/ch08-pipelining/03_buffered/main.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 func Pipeline(o Order) Order { 30 o = Authenticate(o) 31 o = Decrypt(o) 32 o = Charge(o) 33 return o 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 type Order struct { 52 OrderNumber int 53 IsValid bool 54 Credentials string 55 CCardNumber string 56 CCardExpDate string 57 LineItems []LineItem 58 } 59 60 type LineItem struct { 61 Description string 62 Count int 63 PriceUSD gc.USD 64 } 65 func GetOrders() []*Order { 66 67 order1 := &Order{ 68 10001, 69 true, 70 "alice,secret", 71 "7b/HWvtIB9a16AYk+Yv6WWwer3GFbxpjoR+GO9iHIYY=", 72 "0922", 73 []LineItem{ 74 {"Apples", 1, gc.USD{4, 50}}, 75 {"Oranges", 4, gc.USD{12, 00}}, 76 }, 77 } 78 79 order2 := &Order{ 80 10002, 81 true, 82 "bob,secret", 83 "EOc3kF/OmxY+dRCaYRrey8h24QoGzVU0/T2QKVCHb1Q=", 84 "0123", 85 []LineItem{ 86 {"Milk", 2, gc.USD{8, 00}}, 87 {"Sugar", 1, gc.USD{2, 25}}, 88 {"Salt", 3, gc.USD{3, 75}}, 89 }, 90 } 91 orders := []*Order{order1, order2} 92 return orders 93 }