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  }