# README
The deriveMin function returns the minimum of two arguments or the minimum element in a list.
Given the following input:
package min
func positive(i, j int) bool {
return deriveMin(i, j) >= 0
}
type boat struct {
length int
}
func removeMin(boats []boat) []boat {
if len(boats) == 0 {
return boats
}
m := deriveMins(boats, boats[0])
return deriveFilter(func(b boat) bool {
return b != m
}, boats)
}
goderive will generate the following code:
// Code generated by goderive DO NOT EDIT.
package min
// deriveFilter returns a list of all items in the list that matches the predicate.
//
// Deprecated: In favour of generics.
func deriveFilter(predicate func(boat) bool, list []boat) []boat {
j := 0
for i, elem := range list {
if predicate(elem) {
if i != j {
list[j] = list[i]
}
j++
}
}
return list[:j]
}
// deriveMin returns the minimum of the two input values.
//
// Deprecated: In favour of generics.
func deriveMin(a, b int) int {
if a < b {
return a
}
return b
}
// deriveMins returns the minimum value from the list, or the default value if the list is empty.
//
// Deprecated: In favour of generics.
func deriveMins(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 {
return deriveCompare_(&this, &that)
}
// 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
}