Guest User

Untitled

a guest
Jul 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. "sync"
  8. "time"
  9. )
  10.  
  11. type Adder interface {
  12. Add(x, y int) int
  13. }
  14.  
  15. type AdderFunc func(x, y int) int
  16.  
  17. func (a AdderFunc) Add(x, y int) int {
  18. return a(x, y)
  19. }
  20.  
  21. // Middleware function, this function takes in a `Adder` and returns a new `Adder`.
  22. type AdderMiddleware func(Adder) Adder
  23.  
  24. func WrapLogger(logger *log.Logger) AdderMiddleware {
  25. return func(a Adder) Adder {
  26. // Using `AdderFunc` to implement the `Adder` interface.
  27. fn := func(x, y int) (result int) {
  28. defer func(t time.Time) {
  29. logger.Printf("took=%v, x=%v, y=%v, result=%v", time.Since(t), x, y, result)
  30. }(time.Now())
  31. // Propogate call to original adder
  32. return a.Add(x, y)
  33. }
  34. // Return a new `Adder` wrapped with the loggin functionality
  35. return AdderFunc(fn)
  36. }
  37. }
  38.  
  39. func WrapCache(cache *sync.Map) AdderMiddleware {
  40. return func(a Adder) Adder {
  41. fn := func(x, y int) int {
  42. key := fmt.Sprintf("x=%dy=%d", x, y)
  43. val, ok := cache.Load(key)
  44. if ok {
  45. return val.(int)
  46. }
  47. result := a.Add(x, y)
  48. cache.Store(key, result)
  49. return result
  50. }
  51. return AdderFunc(fn)
  52. }
  53. }
  54.  
  55. func Chain(outer AdderMiddleware, middleware ...AdderMiddleware) AdderMiddleware {
  56. return func(a Adder) Adder {
  57. topIndex := len(middleware) - 1
  58. for i := range middleware {
  59. a = middleware[topIndex-i](a)
  60. }
  61. return outer(a)
  62. }
  63. }
  64.  
  65. func main() {
  66. var a Adder = AdderFunc(
  67. func(x, y int) int {
  68. return x + y
  69. },
  70. )
  71. a = Chain(
  72. WrapLogger(log.New(os.Stdout, "test ", 1)),
  73. WrapCache(&sync.Map{}),
  74. )(a)
  75.  
  76. a.Add(10, 20)
  77. }
Add Comment
Please, Sign In to add comment