github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/3-functional-techniques/ch08-pipelining/02_concurrent/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 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 func Pipeline(o Order) Order { 26 o = Authenticate(o) 27 o = Decrypt(o) 28 o = Charge(o) 29 return o 30 } 31 32 33 func Authenticate(o Order) Order { 34 fmt.Printf("Order %d is Authenticated\n", o.OrderNumber) 35 return o 36 } 37 38 func Decrypt(o Order) Order { 39 fmt.Printf("Order %d is Decrypted\n", o.OrderNumber) 40 return o 41 } 42 43 func Charge(o Order) Order { 44 fmt.Printf("Order %d is Charged\n", o.OrderNumber) 45 return o 46 } 47 48 type Order struct { 49 OrderNumber int 50 IsValid bool 51 Credentials string 52 CCardNumber string 53 CCardExpDate string 54 LineItems []LineItem 55 } 56 57 type LineItem struct { 58 Description string 59 Count int 60 PriceUSD gc.USD 61 } 62 func GetOrders() []*Order { 63 64 order1 := &Order{ 65 10001, 66 true, 67 "alice,secret", 68 "7b/HWvtIB9a16AYk+Yv6WWwer3GFbxpjoR+GO9iHIYY=", 69 "0922", 70 []LineItem{ 71 {"Apples", 1, gc.USD{4, 50}}, 72 {"Oranges", 4, gc.USD{12, 00}}, 73 }, 74 } 75 76 order2 := &Order{ 77 10002, 78 true, 79 "bob,secret", 80 "EOc3kF/OmxY+dRCaYRrey8h24QoGzVU0/T2QKVCHb1Q=", 81 "0123", 82 []LineItem{ 83 {"Milk", 2, gc.USD{8, 00}}, 84 {"Sugar", 1, gc.USD{2, 25}}, 85 {"Salt", 3, gc.USD{3, 75}}, 86 }, 87 } 88 orders := []*Order{order1, order2} 89 return orders 90 }