1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package gott
- import "fmt"
- type Exception struct {
- e interface{}
- }
- func (e Exception) Error() string {
- return fmt.Sprintf("function panicked")
- }
- type Result struct {
- s interface{}
- e error
- }
- func NewResult(s interface{}, e error) Result {
- if e != nil {
- return Result{nil, e}
- } else {
- return Result{s, nil}
- }
- }
- func (r Result) Bind(fn func(interface{}) (interface{}, error)) Result {
- if r.e == nil {
- return NewResult(fn(r.s))
- } else {
- return r
- }
- }
- func (r Result) Map(fn func(interface{}) interface{}) Result {
- if r.e == nil {
- return NewResult(fn(r.s), nil)
- } else {
- return r
- }
- }
- func (r Result) Tee(fn func(interface{}) error) Result {
- if r.e == nil {
- r.s = nil
- r.e = fn(r.s)
- }
- return r
- }
- func (r Result) SafeTee(fn func(interface{})) Result {
- if r.e == nil {
- fn(r.s)
- }
- return r
- }
- func (r Result) Catch(fn func(interface{}) interface{}) (result Result) {
- if r.e == nil {
- defer func() {
- if err := recover(); err != nil {
- result = NewResult(nil, Exception{err})
- }
- }()
- result = NewResult(fn(r.s), nil)
- return result
- } else {
- return r
- }
- }
- func (r Result) Handle(onSuccess func(interface{}), onError func(error)) Result {
- if r.e == nil {
- onSuccess(r.s)
- return r
- } else {
- onError(r.e)
- return r
- }
- }
|