Last active
December 25, 2015 23:39
-
-
Save moriyoshi/7058273 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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