The deriveMax function returns the maximum of two arguments or the maximum element in a list.
Given the following input:
package max
func negative(i, j int) bool {
return deriveMax(i, j) < 0
}
type boat struct {
length int
}
func addIfBigger(boats []boat, big boat) []boat {
if len(boats) == 0 {
return append(boats, big)
}
m := deriveMaxs(boats, boats[0])
if deriveCompare(big, m) > 0 {
return append(boats, big)
}
return boats
}
goderive will generate the following code:
// Code generated by goderive DO NOT EDIT.
package max
// deriveCompare returns:
// * 0 if this and that are equal,
// * -1 is this is smaller and
// * +1 is this is bigger.
func deriveCompare(this, that boat) int {
return deriveCompare_(&this, &that)
}
// deriveMax returns the maximum of the two input values.
func deriveMax(a, b int) int {
if a > b {
return a
}
return b
}
// deriveMaxs returns the maximum value from the input list and the default value, if the list is empty.
func deriveMaxs(list []boat, def boat) boat {
if len(list) == 0 {
return def
}
m := list[0]
list = list[1:]
for i, v := range list {
if deriveCompare(v, m) > 0 {
m = list[i]
}
}
return m
}
// deriveCompare_ returns:
// * 0 if this and that are equal,
// * -1 is this is smaller and
// * +1 is this is bigger.
func deriveCompare_(this, that *boat) int {
if this == nil {
if that == nil {
return 0
}
return -1
}
if that == nil {
return 1
}
if c := deriveCompare_i(this.length, that.length); c != 0 {
return c
}
return 0
}
// deriveCompare_i returns:
// * 0 if this and that are equal,
// * -1 is this is smaller and
// * +1 is this is bigger.
func deriveCompare_i(this, that int) int {
if this != that {
if this < that {
return -1
} else {
return 1
}
}
return 0
}