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