12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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
- }
- }
- func (r Result) Finish() (interface{}, error) {
- if r.e != nil {
- return nil, r.e
- } else {
- return r.s, nil
- }
- }
|