Skip to content

Instantly share code, notes, and snippets.

@moriyoshi
Last active December 25, 2015 23:39
Show Gist options
  • Save moriyoshi/7058273 to your computer and use it in GitHub Desktop.
Save moriyoshi/7058273 to your computer and use it in GitHub Desktop.
package main
import "errors"
import "fmt"
type just struct {
fn func () (interface {}, error)
lastRetval interface {}
}
type _error struct {
err error
}
type monad interface {
Do(func () (interface {}, error)) monad
DoIt() (interface{}, error)
End(func (err error)) interface {}
}
func (m *just) DoIt() (interface{}, error) {
if m.fn != nil {
return m.fn()
} else {
return nil, nil
}
}
func (m *just) Do(what func () (interface {}, error)) monad {
retval, err := m.DoIt()
if err != nil {
return &_error { err }
}
return &just { fn: what, lastRetval: retval }
}
func (m *just) End(errorfn func (err error)) interface {} {
retval, err := m.DoIt()
if err != nil {
errorfn(err)
return nil
}
return retval
}
func (m *_error) DoIt() (interface{}, error) {
return nil, m.err
}
func (m *_error) Do(what func () (interface {}, error)) monad {
return &_error { m.err }
}
func (m *_error) End(errorfn func (_ error)) interface {} {
errorfn(m.err)
return nil
}
func main() {
monad := &just {}
monad.Do(func () (interface {}, error) {
println("test1")
return nil, nil
}).Do(func () (interface {}, error) {
println("test2")
// return nil, nil
return nil, errors.New("1")
}).Do(func () (interface {}, error) {
println("test3")
return nil, nil
}).Do(func () (interface {}, error) {
println("test4")
return nil, nil
}).End(func (err error) {
fmt.Printf("I got an error: %s\n", err.Error())
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment