29 lines
795 B
Go
29 lines
795 B
Go
|
package immutable
|
||
|
|
||
|
// Immutable represents an immutable chain that, if passed to FastForward,
|
||
|
// applies Fn() to every element of a chain, the first element of this chain is
|
||
|
// represented by Base().
|
||
|
type Immutable interface {
|
||
|
// Prev is the previous element on a chain.
|
||
|
Prev() Immutable
|
||
|
// Fn a function that is able to modify the passed element.
|
||
|
Fn(interface{}) error
|
||
|
// Base is the first element on a chain, there's no previous element before
|
||
|
// the Base element.
|
||
|
Base() interface{}
|
||
|
}
|
||
|
|
||
|
// FastForward applies all Fn methods in order on the given new Base.
|
||
|
func FastForward(curr Immutable) (interface{}, error) {
|
||
|
prev := curr.Prev()
|
||
|
if prev == nil {
|
||
|
return curr.Base(), nil
|
||
|
}
|
||
|
in, err := FastForward(prev)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
err = curr.Fn(in)
|
||
|
return in, err
|
||
|
}
|