gott.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package gott
  2. import "fmt"
  3. type Exception struct {
  4. e interface{}
  5. }
  6. func (e Exception) Error() string {
  7. return fmt.Sprintf("function panicked")
  8. }
  9. type Result struct {
  10. s interface{}
  11. e error
  12. }
  13. func NewResult(s interface{}, e error) Result {
  14. if e != nil {
  15. return Result{nil, e}
  16. } else {
  17. return Result{s, nil}
  18. }
  19. }
  20. func (r Result) Bind(fn func(interface{}) (interface{}, error)) Result {
  21. if r.e == nil {
  22. return NewResult(fn(r.s))
  23. } else {
  24. return r
  25. }
  26. }
  27. func (r Result) Map(fn func(interface{}) interface{}) Result {
  28. if r.e == nil {
  29. return NewResult(fn(r.s), nil)
  30. } else {
  31. return r
  32. }
  33. }
  34. func (r Result) Tee(fn func(interface{}) error) Result {
  35. if r.e == nil {
  36. r.s = nil
  37. r.e = fn(r.s)
  38. }
  39. return r
  40. }
  41. func (r Result) SafeTee(fn func(interface{})) Result {
  42. if r.e == nil {
  43. fn(r.s)
  44. }
  45. return r
  46. }
  47. func (r Result) Catch(fn func(interface{}) interface{}) (result Result) {
  48. if r.e == nil {
  49. defer func() {
  50. if err := recover(); err != nil {
  51. result = NewResult(nil, Exception{err})
  52. }
  53. }()
  54. result = NewResult(fn(r.s), nil)
  55. return result
  56. } else {
  57. return r
  58. }
  59. }
  60. func (r Result) Handle(onSuccess func(interface{}), onError func(error)) Result {
  61. if r.e == nil {
  62. onSuccess(r.s)
  63. return r
  64. } else {
  65. onError(r.e)
  66. return r
  67. }
  68. }