func ReduceUintErr(f func(uint, uint) (uint, error), list []uint, initializer ...uint) (uint, error) {
	var initVal uint
	var init uint = initVal
	lenList := len(list)
	if initializer != nil {
		init = initializer[0]
	} else if lenList > 0 {
		init = list[0]
		if lenList == 1 {
			return list[0], nil
		}
		if lenList >= 2 {
			list = list[1:]
		}
	}
	if lenList == 0 {
		return init, nil
	}
	r, err := f(init, list[0])
	if err != nil {
		return r, err
	}
	return ReduceUintErr(f, list[1:], r)
}
ReduceUintErr reduces a list to a single value by combining elements via a supplied function

Takes three inputs
A. function - takes two arguments (uint, uint)
B. list of type []uint
C. initializer (optional of type uint)

Returns:
single value, error: (uint, error)
package fp
func ReduceIntErr(f func(int, int) (int, error), list []int, initializer ...int) (int, error) {
	var initVal int
	var init int = initVal
	lenList := len(list)
	if initializer != nil {
		init = initializer[0]
	} else if lenList > 0 {
		init = list[0]
		if lenList == 1 {
			return list[0], nil
		}
		if lenList >= 2 {
			list = list[1:]
		}
	}
	if lenList == 0 {
		return init, nil
	}
	r, err := f(init, list[0])
	if err != nil {
		return r, err
	}
	return ReduceIntErr(f, list[1:], r)
}
func ReduceInt64Err(f func(int64, int64) (int64, error), list []int64, initializer ...int64) (int64, error) {
	var initVal int64
	var init int64 = initVal
	lenList := len(list)
	if initializer != nil {
		init = initializer[0]
	} else if lenList > 0 {
		init = list[0]
		if lenList == 1 {
			return list[0], nil
		}
		if lenList >= 2 {
			list = list[1:]
		}
	}
	if lenList == 0 {
		return init, nil
	}
	r, err := f(init, list[0])
	if err != nil {
		return r, err
	}
	return ReduceInt64Err(f, list[1:], r)
}
func ReduceInt32Err(f func(int32, int32) (int32, error), list []int32, initializer ...int32) (int32, error) {
	var initVal int32
	var init int32 = initVal
	lenList := len(list)
	if initializer != nil {
		init = initializer[0]
	} else if lenList > 0 {
		init = list[0]
		if lenList == 1 {
			return list[0], nil
		}
		if lenList >= 2 {
			list = list[1:]
		}
	}
	if lenList == 0 {
		return init, nil
	}
	r, err := f(init, list[0])
	if err != nil {
		return r, err
	}
	return ReduceInt32Err(f, list[1:], r)
}
func ReduceInt16Err(f func(int16, int16) (int16, error), list []int16, initializer ...int16) (int16, error) {
	var initVal int16
	var init int16 = initVal
	lenList := len(list)
	if initializer != nil {
		init = initializer[0]
	} else if lenList > 0 {
		init = list[0]
		if lenList == 1 {
			return list[0], nil
		}
		if lenList >= 2 {
			list = list[1:]
		}
	}
	if lenList == 0 {
		return init, nil
	}
	r, err := f(init, list[0])
	if err != nil {
		return r, err
	}
	return ReduceInt16Err(f, list[1:], r)
}
func ReduceInt8Err(f func(int8, int8) (int8, error), list []int8, initializer ...int8) (int8, error) {
	var initVal int8
	var init int8 = initVal
	lenList := len(list)
	if initializer != nil {
		init = initializer[0]
	} else if lenList > 0 {
		init = list[0]
		if lenList == 1 {
			return list[0], nil
		}
		if lenList >= 2 {
			list = list[1:]
		}
	}
	if lenList == 0 {
		return init, nil
	}
	r, err := f(init, list[0])
	if err != nil {
		return r, err
	}
	return ReduceInt8Err(f, list[1:], r)
}