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  }