...
Tawesoft Logo

Package operator

import "tawesoft.co.uk/go/operator"
Overview
Index
Subdirectories

Overview ▾

Package operator implements logical, arithmetic, bitwise and comparison operators as functions (like the Python operator module). Includes unary, binary, and n-ary functions with overflow checked variants.

Examples

Using operators as function arguments

https://www.tawesoft.co.uk/go/doc/operator/examples/simple/

Using operators in lookup tables for a command-line calculator program

https://www.tawesoft.co.uk/go/doc/operator/examples/calculator/

Package Information

License: MIT-0 (see LICENSE.txt)

Stable: yes

For more information, documentation, source code, examples, support, links, etc. please see https://www.tawesoft.co.uk/go and https://www.tawesoft.co.uk/go/operator

Variables

Bool implements operations on one (unary), two (binary), or many (nary) arguments of type bool.

var Bool = struct {
    Unary  boolUnary
    Binary boolBinary
    Nary   boolNary
}{
    Unary: boolUnary{
        True:     func(_ bool) bool { return true },
        False:    func(_ bool) bool { return false },
        Identity: func(p bool) bool { return p },
        Not:      func(p bool) bool { return !p },
    },

    Binary: boolBinary{
        True:          func(_ bool, _ bool) bool { return true },
        False:         func(_ bool, _ bool) bool { return false },
        P:             func(p bool, _ bool) bool { return p },
        Q:             func(_ bool, q bool) bool { return q },
        NotP:          func(p bool, _ bool) bool { return !p },
        NotQ:          func(_ bool, q bool) bool { return !q },
        Eq:            func(p bool, q bool) bool { return p == q },
        Neq:           func(p bool, q bool) bool { return p != q },
        And:           func(p bool, q bool) bool { return p && q },
        Nand:          func(p bool, q bool) bool { return !(p && q) },
        Or:            func(p bool, q bool) bool { return p || q },
        Nor:           func(p bool, q bool) bool { return !(p || q) },
        Xor:           func(p bool, q bool) bool { return p != q },
        Xnor:          func(p bool, q bool) bool { return p == q },
        Implies:       func(p bool, q bool) bool { return (!p) || q },
        NonImplies:    func(p bool, q bool) bool { return p && (!q) },
        ConImplies:    func(p bool, q bool) bool { return (!q) || p },
        ConNonImplies: func(p bool, q bool) bool { return q && (!p) },
    },

    Nary: boolNary{
        True:  func(_ ...bool) bool { return true },
        False: func(_ ...bool) bool { return false },
        All:   boolNaryAll1,
        Any:   boolNaryAny1,
        None:  boolNaryNone1,
    },
}

ErrorNaN is the return type used for an operation on a float that is Not a Number in a checked function

var ErrorNaN = fmt.Errorf("Not a number (NaN)")

ErrorOverflow is the return type used for integer overflow in a checked function

var ErrorOverflow = fmt.Errorf("Overflow")

ErrorOverflow is the return type used for an undefined operation in a checked function such as shifting a negative integer left or divide by zero

var ErrorUndefined = fmt.Errorf("Undefined operation")

Float32 implements operations on one (unary), two (binary), or many (nary) arguments of type float32.

var Float32 = struct {
    Unary  float32Unary
    Binary float32Binary
    Nary   float32Nary
    Reduce func(operatorIdentity float32, operator func(float32, float32) float32, elements ...float32) float32
}{
    Unary: float32Unary{
        Identity: func(a float32) float32 { return a },
        Abs:      float32UnaryAbs,
        Negation: func(a float32) float32 { return -a },
        Zero:     func(a float32) bool { return a == 0 },
        NonZero:  func(a float32) bool { return a != 0 },
        Positive: float32UnaryPositive,
        Negative: float32UnaryNegative,
    },

    Binary: float32Binary{
        Add: func(a float32, b float32) float32 { return a + b },
        Sub: func(a float32, b float32) float32 { return a - b },
        Mul: func(a float32, b float32) float32 { return a * b },
        Div: func(a float32, b float32) float32 { return a / b },

        Eq:  func(a float32, b float32) bool { return a == b },
        Neq: func(a float32, b float32) bool { return a != b },
        Lt:  func(a float32, b float32) bool { return a < b },
        Lte: func(a float32, b float32) bool { return a <= b },
        Gt:  func(a float32, b float32) bool { return a > b },
        Gte: func(a float32, b float32) bool { return a >= b },
    },

    Nary: float32Nary{
        Add: float32NaryAdd,
        Mul: float32NaryMul,
    },

    Reduce: float32Reduce,
}

Float32Checked implements operations on one (unary), two (binary), or many (nary) arguments of type float32, returning an error in cases such as overflow or an undefined operation.

var Float32Checked = struct {
    Unary  float32UnaryChecked
    Binary float32BinaryChecked
    Nary   float32NaryChecked
    Reduce func(operatorIdentity float32, operator func(float32, float32) (float32, error), elements ...float32) (float32, error)
}{
    Unary: float32UnaryChecked{
        Abs:      float32UnaryCheckedAbs,
        Negation: float32UnaryCheckedNegation,
    },

    Binary: float32BinaryChecked{
        Add: float32BinaryCheckedAdd,
        Sub: float32BinaryCheckedSub,
        Mul: float32BinaryCheckedMul,
        Div: float32BinaryCheckedDiv,
    },

    Nary: float32NaryChecked{
        Add: float32NaryCheckedAdd,
        Mul: float32NaryCheckedMul,
    },

    Reduce: float32CheckedReduce,
}

Float64 implements operations on one (unary), two (binary), or many (nary) arguments of type float64.

var Float64 = struct {
    Unary  float64Unary
    Binary float64Binary
    Nary   float64Nary
    Reduce func(operatorIdentity float64, operator func(float64, float64) float64, elements ...float64) float64
}{
    Unary: float64Unary{
        Identity: func(a float64) float64 { return a },
        Abs:      float64UnaryAbs,
        Negation: func(a float64) float64 { return -a },
        Zero:     func(a float64) bool { return a == 0 },
        NonZero:  func(a float64) bool { return a != 0 },
        Positive: float64UnaryPositive,
        Negative: float64UnaryNegative,
    },

    Binary: float64Binary{
        Add: func(a float64, b float64) float64 { return a + b },
        Sub: func(a float64, b float64) float64 { return a - b },
        Mul: func(a float64, b float64) float64 { return a * b },
        Div: func(a float64, b float64) float64 { return a / b },

        Eq:  func(a float64, b float64) bool { return a == b },
        Neq: func(a float64, b float64) bool { return a != b },
        Lt:  func(a float64, b float64) bool { return a < b },
        Lte: func(a float64, b float64) bool { return a <= b },
        Gt:  func(a float64, b float64) bool { return a > b },
        Gte: func(a float64, b float64) bool { return a >= b },
    },

    Nary: float64Nary{
        Add: float64NaryAdd,
        Mul: float64NaryMul,
    },

    Reduce: float64Reduce,
}

Float64Checked implements operations on one (unary), two (binary), or many (nary) arguments of type float64, returning an error in cases such as overflow or an undefined operation.

var Float64Checked = struct {
    Unary  float64UnaryChecked
    Binary float64BinaryChecked
    Nary   float64NaryChecked
    Reduce func(operatorIdentity float64, operator func(float64, float64) (float64, error), elements ...float64) (float64, error)
}{
    Unary: float64UnaryChecked{
        Abs:      float64UnaryCheckedAbs,
        Negation: float64UnaryCheckedNegation,
    },

    Binary: float64BinaryChecked{
        Add: float64BinaryCheckedAdd,
        Sub: float64BinaryCheckedSub,
        Mul: float64BinaryCheckedMul,
        Div: float64BinaryCheckedDiv,
    },

    Nary: float64NaryChecked{
        Add: float64NaryCheckedAdd,
        Mul: float64NaryCheckedMul,
    },

    Reduce: float64CheckedReduce,
}

Int implements operations on one (unary), two (binary), or many (nary) arguments of type int.

var Int = struct {
    Unary  intUnary
    Binary intBinary
    Nary   intNary
    Reduce func(operatorIdentity int, operator func(int, int) int, elements ...int) int
}{
    Unary: intUnary{
        Identity: func(a int) int { return a },
        Abs:      intUnaryAbs,
        Negation: func(a int) int { return -a },
        Zero:     func(a int) bool { return a == 0 },
        NonZero:  func(a int) bool { return a != 0 },
        Positive: intUnaryPositive,
        Negative: intUnaryNegative,
    },

    Binary: intBinary{
        Add: func(a int, b int) int { return a + b },
        Sub: func(a int, b int) int { return a - b },
        Mul: func(a int, b int) int { return a * b },
        Div: func(a int, b int) int { return a / b },

        Eq:  func(a int, b int) bool { return a == b },
        Neq: func(a int, b int) bool { return a != b },
        Lt:  func(a int, b int) bool { return a < b },
        Lte: func(a int, b int) bool { return a <= b },
        Gt:  func(a int, b int) bool { return a > b },
        Gte: func(a int, b int) bool { return a >= b },

        And:    func(a int, b int) int { return a & b },
        Or:     func(a int, b int) int { return a | b },
        Xor:    func(a int, b int) int { return a ^ b },
        AndNot: func(a int, b int) int { return a &^ b },
        Mod:    func(a int, b int) int { return a % b },

        Shl: func(a int, b uint) int { return a << b },
        Shr: func(a int, b uint) int { return a >> b },
    },

    Nary: intNary{
        Add: intNaryAdd,
        Mul: intNaryMul,
    },

    Reduce: intReduce,
}

Int16 implements operations on one (unary), two (binary), or many (nary) arguments of type int16.

var Int16 = struct {
    Unary  int16Unary
    Binary int16Binary
    Nary   int16Nary
    Reduce func(operatorIdentity int16, operator func(int16, int16) int16, elements ...int16) int16
}{
    Unary: int16Unary{
        Identity: func(a int16) int16 { return a },
        Abs:      int16UnaryAbs,
        Negation: func(a int16) int16 { return -a },
        Zero:     func(a int16) bool { return a == 0 },
        NonZero:  func(a int16) bool { return a != 0 },
        Positive: int16UnaryPositive,
        Negative: int16UnaryNegative,
    },

    Binary: int16Binary{
        Add: func(a int16, b int16) int16 { return a + b },
        Sub: func(a int16, b int16) int16 { return a - b },
        Mul: func(a int16, b int16) int16 { return a * b },
        Div: func(a int16, b int16) int16 { return a / b },

        Eq:  func(a int16, b int16) bool { return a == b },
        Neq: func(a int16, b int16) bool { return a != b },
        Lt:  func(a int16, b int16) bool { return a < b },
        Lte: func(a int16, b int16) bool { return a <= b },
        Gt:  func(a int16, b int16) bool { return a > b },
        Gte: func(a int16, b int16) bool { return a >= b },

        And:    func(a int16, b int16) int16 { return a & b },
        Or:     func(a int16, b int16) int16 { return a | b },
        Xor:    func(a int16, b int16) int16 { return a ^ b },
        AndNot: func(a int16, b int16) int16 { return a &^ b },
        Mod:    func(a int16, b int16) int16 { return a % b },

        Shl: func(a int16, b uint) int16 { return a << b },
        Shr: func(a int16, b uint) int16 { return a >> b },
    },

    Nary: int16Nary{
        Add: int16NaryAdd,
        Mul: int16NaryMul,
    },

    Reduce: int16Reduce,
}

Int16Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int16, returning an error in cases such as overflow or an undefined operation.

var Int16Checked = struct {
    Unary  int16UnaryChecked
    Binary int16BinaryChecked
    Nary   int16NaryChecked
    Reduce func(operatorIdentity int16, operator func(int16, int16) (int16, error), elements ...int16) (int16, error)
}{
    Unary: int16UnaryChecked{
        Abs:      int16UnaryCheckedAbs,
        Negation: int16UnaryCheckedNegation,
    },

    Binary: int16BinaryChecked{
        Add: int16BinaryCheckedAdd,
        Sub: int16BinaryCheckedSub,
        Mul: int16BinaryCheckedMul,
        Div: int16BinaryCheckedDiv,
        Shl: int16BinaryCheckedShl,
    },

    Nary: int16NaryChecked{
        Add: int16NaryCheckedAdd,
        Mul: int16NaryCheckedMul,
    },

    Reduce: int16CheckedReduce,
}

Int32 implements operations on one (unary), two (binary), or many (nary) arguments of type int32.

var Int32 = struct {
    Unary  int32Unary
    Binary int32Binary
    Nary   int32Nary
    Reduce func(operatorIdentity int32, operator func(int32, int32) int32, elements ...int32) int32
}{
    Unary: int32Unary{
        Identity: func(a int32) int32 { return a },
        Abs:      int32UnaryAbs,
        Negation: func(a int32) int32 { return -a },
        Zero:     func(a int32) bool { return a == 0 },
        NonZero:  func(a int32) bool { return a != 0 },
        Positive: int32UnaryPositive,
        Negative: int32UnaryNegative,
    },

    Binary: int32Binary{
        Add: func(a int32, b int32) int32 { return a + b },
        Sub: func(a int32, b int32) int32 { return a - b },
        Mul: func(a int32, b int32) int32 { return a * b },
        Div: func(a int32, b int32) int32 { return a / b },

        Eq:  func(a int32, b int32) bool { return a == b },
        Neq: func(a int32, b int32) bool { return a != b },
        Lt:  func(a int32, b int32) bool { return a < b },
        Lte: func(a int32, b int32) bool { return a <= b },
        Gt:  func(a int32, b int32) bool { return a > b },
        Gte: func(a int32, b int32) bool { return a >= b },

        And:    func(a int32, b int32) int32 { return a & b },
        Or:     func(a int32, b int32) int32 { return a | b },
        Xor:    func(a int32, b int32) int32 { return a ^ b },
        AndNot: func(a int32, b int32) int32 { return a &^ b },
        Mod:    func(a int32, b int32) int32 { return a % b },

        Shl: func(a int32, b uint) int32 { return a << b },
        Shr: func(a int32, b uint) int32 { return a >> b },
    },

    Nary: int32Nary{
        Add: int32NaryAdd,
        Mul: int32NaryMul,
    },

    Reduce: int32Reduce,
}

Int32Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int32, returning an error in cases such as overflow or an undefined operation.

var Int32Checked = struct {
    Unary  int32UnaryChecked
    Binary int32BinaryChecked
    Nary   int32NaryChecked
    Reduce func(operatorIdentity int32, operator func(int32, int32) (int32, error), elements ...int32) (int32, error)
}{
    Unary: int32UnaryChecked{
        Abs:      int32UnaryCheckedAbs,
        Negation: int32UnaryCheckedNegation,
    },

    Binary: int32BinaryChecked{
        Add: int32BinaryCheckedAdd,
        Sub: int32BinaryCheckedSub,
        Mul: int32BinaryCheckedMul,
        Div: int32BinaryCheckedDiv,
        Shl: int32BinaryCheckedShl,
    },

    Nary: int32NaryChecked{
        Add: int32NaryCheckedAdd,
        Mul: int32NaryCheckedMul,
    },

    Reduce: int32CheckedReduce,
}

Int64 implements operations on one (unary), two (binary), or many (nary) arguments of type int64.

var Int64 = struct {
    Unary  int64Unary
    Binary int64Binary
    Nary   int64Nary
    Reduce func(operatorIdentity int64, operator func(int64, int64) int64, elements ...int64) int64
}{
    Unary: int64Unary{
        Identity: func(a int64) int64 { return a },
        Abs:      int64UnaryAbs,
        Negation: func(a int64) int64 { return -a },
        Zero:     func(a int64) bool { return a == 0 },
        NonZero:  func(a int64) bool { return a != 0 },
        Positive: int64UnaryPositive,
        Negative: int64UnaryNegative,
    },

    Binary: int64Binary{
        Add: func(a int64, b int64) int64 { return a + b },
        Sub: func(a int64, b int64) int64 { return a - b },
        Mul: func(a int64, b int64) int64 { return a * b },
        Div: func(a int64, b int64) int64 { return a / b },

        Eq:  func(a int64, b int64) bool { return a == b },
        Neq: func(a int64, b int64) bool { return a != b },
        Lt:  func(a int64, b int64) bool { return a < b },
        Lte: func(a int64, b int64) bool { return a <= b },
        Gt:  func(a int64, b int64) bool { return a > b },
        Gte: func(a int64, b int64) bool { return a >= b },

        And:    func(a int64, b int64) int64 { return a & b },
        Or:     func(a int64, b int64) int64 { return a | b },
        Xor:    func(a int64, b int64) int64 { return a ^ b },
        AndNot: func(a int64, b int64) int64 { return a &^ b },
        Mod:    func(a int64, b int64) int64 { return a % b },

        Shl: func(a int64, b uint) int64 { return a << b },
        Shr: func(a int64, b uint) int64 { return a >> b },
    },

    Nary: int64Nary{
        Add: int64NaryAdd,
        Mul: int64NaryMul,
    },

    Reduce: int64Reduce,
}

Int64Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int64, returning an error in cases such as overflow or an undefined operation.

var Int64Checked = struct {
    Unary  int64UnaryChecked
    Binary int64BinaryChecked
    Nary   int64NaryChecked
    Reduce func(operatorIdentity int64, operator func(int64, int64) (int64, error), elements ...int64) (int64, error)
}{
    Unary: int64UnaryChecked{
        Abs:      int64UnaryCheckedAbs,
        Negation: int64UnaryCheckedNegation,
    },

    Binary: int64BinaryChecked{
        Add: int64BinaryCheckedAdd,
        Sub: int64BinaryCheckedSub,
        Mul: int64BinaryCheckedMul,
        Div: int64BinaryCheckedDiv,
        Shl: int64BinaryCheckedShl,
    },

    Nary: int64NaryChecked{
        Add: int64NaryCheckedAdd,
        Mul: int64NaryCheckedMul,
    },

    Reduce: int64CheckedReduce,
}

Int8 implements operations on one (unary), two (binary), or many (nary) arguments of type int8.

var Int8 = struct {
    Unary  int8Unary
    Binary int8Binary
    Nary   int8Nary
    Reduce func(operatorIdentity int8, operator func(int8, int8) int8, elements ...int8) int8
}{
    Unary: int8Unary{
        Identity: func(a int8) int8 { return a },
        Abs:      int8UnaryAbs,
        Negation: func(a int8) int8 { return -a },
        Zero:     func(a int8) bool { return a == 0 },
        NonZero:  func(a int8) bool { return a != 0 },
        Positive: int8UnaryPositive,
        Negative: int8UnaryNegative,
    },

    Binary: int8Binary{
        Add: func(a int8, b int8) int8 { return a + b },
        Sub: func(a int8, b int8) int8 { return a - b },
        Mul: func(a int8, b int8) int8 { return a * b },
        Div: func(a int8, b int8) int8 { return a / b },

        Eq:  func(a int8, b int8) bool { return a == b },
        Neq: func(a int8, b int8) bool { return a != b },
        Lt:  func(a int8, b int8) bool { return a < b },
        Lte: func(a int8, b int8) bool { return a <= b },
        Gt:  func(a int8, b int8) bool { return a > b },
        Gte: func(a int8, b int8) bool { return a >= b },

        And:    func(a int8, b int8) int8 { return a & b },
        Or:     func(a int8, b int8) int8 { return a | b },
        Xor:    func(a int8, b int8) int8 { return a ^ b },
        AndNot: func(a int8, b int8) int8 { return a &^ b },
        Mod:    func(a int8, b int8) int8 { return a % b },

        Shl: func(a int8, b uint) int8 { return a << b },
        Shr: func(a int8, b uint) int8 { return a >> b },
    },

    Nary: int8Nary{
        Add: int8NaryAdd,
        Mul: int8NaryMul,
    },

    Reduce: int8Reduce,
}

Int8Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int8, returning an error in cases such as overflow or an undefined operation.

var Int8Checked = struct {
    Unary  int8UnaryChecked
    Binary int8BinaryChecked
    Nary   int8NaryChecked
    Reduce func(operatorIdentity int8, operator func(int8, int8) (int8, error), elements ...int8) (int8, error)
}{
    Unary: int8UnaryChecked{
        Abs:      int8UnaryCheckedAbs,
        Negation: int8UnaryCheckedNegation,
    },

    Binary: int8BinaryChecked{
        Add: int8BinaryCheckedAdd,
        Sub: int8BinaryCheckedSub,
        Mul: int8BinaryCheckedMul,
        Div: int8BinaryCheckedDiv,
        Shl: int8BinaryCheckedShl,
    },

    Nary: int8NaryChecked{
        Add: int8NaryCheckedAdd,
        Mul: int8NaryCheckedMul,
    },

    Reduce: int8CheckedReduce,
}

IntChecked implements operations on one (unary), two (binary), or many (nary) arguments of type int, returning an error in cases such as overflow or an undefined operation.

var IntChecked = struct {
    Unary  intUnaryChecked
    Binary intBinaryChecked
    Nary   intNaryChecked
    Reduce func(operatorIdentity int, operator func(int, int) (int, error), elements ...int) (int, error)
}{
    Unary: intUnaryChecked{
        Abs:      intUnaryCheckedAbs,
        Negation: intUnaryCheckedNegation,
    },

    Binary: intBinaryChecked{
        Add: intBinaryCheckedAdd,
        Sub: intBinaryCheckedSub,
        Mul: intBinaryCheckedMul,
        Div: intBinaryCheckedDiv,
        Shl: intBinaryCheckedShl,
    },

    Nary: intNaryChecked{
        Add: intNaryCheckedAdd,
        Mul: intNaryCheckedMul,
    },

    Reduce: intCheckedReduce,
}

Uint implements operations on one (unary), two (binary), or many (nary) arguments of type uint.

var Uint = struct {
    Unary  uintUnary
    Binary uintBinary
    Nary   uintNary
    Reduce func(operatorIdentity uint, operator func(uint, uint) uint, elements ...uint) uint
}{
    Unary: uintUnary{
        Identity: func(a uint) uint { return a },
        Not:      func(a uint) uint { return ^a },
        Zero:     func(a uint) bool { return a == 0 },
        NonZero:  func(a uint) bool { return a != 0 },
        Positive: uintUnaryPositive,
        Negative: uintUnaryNegative,
    },

    Binary: uintBinary{
        Add: func(a uint, b uint) uint { return a + b },
        Sub: func(a uint, b uint) uint { return a - b },
        Mul: func(a uint, b uint) uint { return a * b },
        Div: func(a uint, b uint) uint { return a / b },

        Eq:  func(a uint, b uint) bool { return a == b },
        Neq: func(a uint, b uint) bool { return a != b },
        Lt:  func(a uint, b uint) bool { return a < b },
        Lte: func(a uint, b uint) bool { return a <= b },
        Gt:  func(a uint, b uint) bool { return a > b },
        Gte: func(a uint, b uint) bool { return a >= b },

        And:    func(a uint, b uint) uint { return a & b },
        Or:     func(a uint, b uint) uint { return a | b },
        Xor:    func(a uint, b uint) uint { return a ^ b },
        AndNot: func(a uint, b uint) uint { return a &^ b },
        Mod:    func(a uint, b uint) uint { return a % b },

        Shl: func(a uint, b uint) uint { return a << b },
        Shr: func(a uint, b uint) uint { return a >> b },
    },

    Nary: uintNary{
        Add: uintNaryAdd,
        Mul: uintNaryMul,
    },

    Reduce: uintReduce,
}

Uint16 implements operations on one (unary), two (binary), or many (nary) arguments of type uint16.

var Uint16 = struct {
    Unary  uint16Unary
    Binary uint16Binary
    Nary   uint16Nary
    Reduce func(operatorIdentity uint16, operator func(uint16, uint16) uint16, elements ...uint16) uint16
}{
    Unary: uint16Unary{
        Identity: func(a uint16) uint16 { return a },
        Not:      func(a uint16) uint16 { return ^a },
        Zero:     func(a uint16) bool { return a == 0 },
        NonZero:  func(a uint16) bool { return a != 0 },
        Positive: uint16UnaryPositive,
        Negative: uint16UnaryNegative,
    },

    Binary: uint16Binary{
        Add: func(a uint16, b uint16) uint16 { return a + b },
        Sub: func(a uint16, b uint16) uint16 { return a - b },
        Mul: func(a uint16, b uint16) uint16 { return a * b },
        Div: func(a uint16, b uint16) uint16 { return a / b },

        Eq:  func(a uint16, b uint16) bool { return a == b },
        Neq: func(a uint16, b uint16) bool { return a != b },
        Lt:  func(a uint16, b uint16) bool { return a < b },
        Lte: func(a uint16, b uint16) bool { return a <= b },
        Gt:  func(a uint16, b uint16) bool { return a > b },
        Gte: func(a uint16, b uint16) bool { return a >= b },

        And:    func(a uint16, b uint16) uint16 { return a & b },
        Or:     func(a uint16, b uint16) uint16 { return a | b },
        Xor:    func(a uint16, b uint16) uint16 { return a ^ b },
        AndNot: func(a uint16, b uint16) uint16 { return a &^ b },
        Mod:    func(a uint16, b uint16) uint16 { return a % b },

        Shl: func(a uint16, b uint) uint16 { return a << b },
        Shr: func(a uint16, b uint) uint16 { return a >> b },
    },

    Nary: uint16Nary{
        Add: uint16NaryAdd,
        Mul: uint16NaryMul,
    },

    Reduce: uint16Reduce,
}

Uint16Checked implements operations on one (unary), two (binary), or many (nary) arguments of type uint16, returning an error in cases such as overflow or an undefined operation.

var Uint16Checked = struct {
    Unary  uint16UnaryChecked
    Binary uint16BinaryChecked
    Nary   uint16NaryChecked
    Reduce func(operatorIdentity uint16, operator func(uint16, uint16) (uint16, error), elements ...uint16) (uint16, error)
}{
    Unary: uint16UnaryChecked{},

    Binary: uint16BinaryChecked{
        Add: uint16BinaryCheckedAdd,
        Sub: uint16BinaryCheckedSub,
        Mul: uint16BinaryCheckedMul,
        Div: uint16BinaryCheckedDiv,
        Shl: uint16BinaryCheckedShl,
    },

    Nary: uint16NaryChecked{
        Add: uint16NaryCheckedAdd,
        Mul: uint16NaryCheckedMul,
    },

    Reduce: uint16CheckedReduce,
}

Uint32 implements operations on one (unary), two (binary), or many (nary) arguments of type uint32.

var Uint32 = struct {
    Unary  uint32Unary
    Binary uint32Binary
    Nary   uint32Nary
    Reduce func(operatorIdentity uint32, operator func(uint32, uint32) uint32, elements ...uint32) uint32
}{
    Unary: uint32Unary{
        Identity: func(a uint32) uint32 { return a },
        Not:      func(a uint32) uint32 { return ^a },
        Zero:     func(a uint32) bool { return a == 0 },
        NonZero:  func(a uint32) bool { return a != 0 },
        Positive: uint32UnaryPositive,
        Negative: uint32UnaryNegative,
    },

    Binary: uint32Binary{
        Add: func(a uint32, b uint32) uint32 { return a + b },
        Sub: func(a uint32, b uint32) uint32 { return a - b },
        Mul: func(a uint32, b uint32) uint32 { return a * b },
        Div: func(a uint32, b uint32) uint32 { return a / b },

        Eq:  func(a uint32, b uint32) bool { return a == b },
        Neq: func(a uint32, b uint32) bool { return a != b },
        Lt:  func(a uint32, b uint32) bool { return a < b },
        Lte: func(a uint32, b uint32) bool { return a <= b },
        Gt:  func(a uint32, b uint32) bool { return a > b },
        Gte: func(a uint32, b uint32) bool { return a >= b },

        And:    func(a uint32, b uint32) uint32 { return a & b },
        Or:     func(a uint32, b uint32) uint32 { return a | b },
        Xor:    func(a uint32, b uint32) uint32 { return a ^ b },
        AndNot: func(a uint32, b uint32) uint32 { return a &^ b },
        Mod:    func(a uint32, b uint32) uint32 { return a % b },

        Shl: func(a uint32, b uint) uint32 { return a << b },
        Shr: func(a uint32, b uint) uint32 { return a >> b },
    },

    Nary: uint32Nary{
        Add: uint32NaryAdd,
        Mul: uint32NaryMul,
    },

    Reduce: uint32Reduce,
}

Uint32Checked implements operations on one (unary), two (binary), or many (nary) arguments of type uint32, returning an error in cases such as overflow or an undefined operation.

var Uint32Checked = struct {
    Unary  uint32UnaryChecked
    Binary uint32BinaryChecked
    Nary   uint32NaryChecked
    Reduce func(operatorIdentity uint32, operator func(uint32, uint32) (uint32, error), elements ...uint32) (uint32, error)
}{
    Unary: uint32UnaryChecked{},

    Binary: uint32BinaryChecked{
        Add: uint32BinaryCheckedAdd,
        Sub: uint32BinaryCheckedSub,
        Mul: uint32BinaryCheckedMul,
        Div: uint32BinaryCheckedDiv,
        Shl: uint32BinaryCheckedShl,
    },

    Nary: uint32NaryChecked{
        Add: uint32NaryCheckedAdd,
        Mul: uint32NaryCheckedMul,
    },

    Reduce: uint32CheckedReduce,
}

Uint64 implements operations on one (unary), two (binary), or many (nary) arguments of type uint64.

var Uint64 = struct {
    Unary  uint64Unary
    Binary uint64Binary
    Nary   uint64Nary
    Reduce func(operatorIdentity uint64, operator func(uint64, uint64) uint64, elements ...uint64) uint64
}{
    Unary: uint64Unary{
        Identity: func(a uint64) uint64 { return a },
        Not:      func(a uint64) uint64 { return ^a },
        Zero:     func(a uint64) bool { return a == 0 },
        NonZero:  func(a uint64) bool { return a != 0 },
        Positive: uint64UnaryPositive,
        Negative: uint64UnaryNegative,
    },

    Binary: uint64Binary{
        Add: func(a uint64, b uint64) uint64 { return a + b },
        Sub: func(a uint64, b uint64) uint64 { return a - b },
        Mul: func(a uint64, b uint64) uint64 { return a * b },
        Div: func(a uint64, b uint64) uint64 { return a / b },

        Eq:  func(a uint64, b uint64) bool { return a == b },
        Neq: func(a uint64, b uint64) bool { return a != b },
        Lt:  func(a uint64, b uint64) bool { return a < b },
        Lte: func(a uint64, b uint64) bool { return a <= b },
        Gt:  func(a uint64, b uint64) bool { return a > b },
        Gte: func(a uint64, b uint64) bool { return a >= b },

        And:    func(a uint64, b uint64) uint64 { return a & b },
        Or:     func(a uint64, b uint64) uint64 { return a | b },
        Xor:    func(a uint64, b uint64) uint64 { return a ^ b },
        AndNot: func(a uint64, b uint64) uint64 { return a &^ b },
        Mod:    func(a uint64, b uint64) uint64 { return a % b },

        Shl: func(a uint64, b uint) uint64 { return a << b },
        Shr: func(a uint64, b uint) uint64 { return a >> b },
    },

    Nary: uint64Nary{
        Add: uint64NaryAdd,
        Mul: uint64NaryMul,
    },

    Reduce: uint64Reduce,
}

Uint64Checked implements operations on one (unary), two (binary), or many (nary) arguments of type uint64, returning an error in cases such as overflow or an undefined operation.

var Uint64Checked = struct {
    Unary  uint64UnaryChecked
    Binary uint64BinaryChecked
    Nary   uint64NaryChecked
    Reduce func(operatorIdentity uint64, operator func(uint64, uint64) (uint64, error), elements ...uint64) (uint64, error)
}{
    Unary: uint64UnaryChecked{},

    Binary: uint64BinaryChecked{
        Add: uint64BinaryCheckedAdd,
        Sub: uint64BinaryCheckedSub,
        Mul: uint64BinaryCheckedMul,
        Div: uint64BinaryCheckedDiv,
        Shl: uint64BinaryCheckedShl,
    },

    Nary: uint64NaryChecked{
        Add: uint64NaryCheckedAdd,
        Mul: uint64NaryCheckedMul,
    },

    Reduce: uint64CheckedReduce,
}

Uint8 implements operations on one (unary), two (binary), or many (nary) arguments of type uint8.

var Uint8 = struct {
    Unary  uint8Unary
    Binary uint8Binary
    Nary   uint8Nary
    Reduce func(operatorIdentity uint8, operator func(uint8, uint8) uint8, elements ...uint8) uint8
}{
    Unary: uint8Unary{
        Identity: func(a uint8) uint8 { return a },
        Not:      func(a uint8) uint8 { return ^a },
        Zero:     func(a uint8) bool { return a == 0 },
        NonZero:  func(a uint8) bool { return a != 0 },
        Positive: uint8UnaryPositive,
        Negative: uint8UnaryNegative,
    },

    Binary: uint8Binary{
        Add: func(a uint8, b uint8) uint8 { return a + b },
        Sub: func(a uint8, b uint8) uint8 { return a - b },
        Mul: func(a uint8, b uint8) uint8 { return a * b },
        Div: func(a uint8, b uint8) uint8 { return a / b },

        Eq:  func(a uint8, b uint8) bool { return a == b },
        Neq: func(a uint8, b uint8) bool { return a != b },
        Lt:  func(a uint8, b uint8) bool { return a < b },
        Lte: func(a uint8, b uint8) bool { return a <= b },
        Gt:  func(a uint8, b uint8) bool { return a > b },
        Gte: func(a uint8, b uint8) bool { return a >= b },

        And:    func(a uint8, b uint8) uint8 { return a & b },
        Or:     func(a uint8, b uint8) uint8 { return a | b },
        Xor:    func(a uint8, b uint8) uint8 { return a ^ b },
        AndNot: func(a uint8, b uint8) uint8 { return a &^ b },
        Mod:    func(a uint8, b uint8) uint8 { return a % b },

        Shl: func(a uint8, b uint) uint8 { return a << b },
        Shr: func(a uint8, b uint) uint8 { return a >> b },
    },

    Nary: uint8Nary{
        Add: uint8NaryAdd,
        Mul: uint8NaryMul,
    },

    Reduce: uint8Reduce,
}

Uint8Checked implements operations on one (unary), two (binary), or many (nary) arguments of type uint8, returning an error in cases such as overflow or an undefined operation.

var Uint8Checked = struct {
    Unary  uint8UnaryChecked
    Binary uint8BinaryChecked
    Nary   uint8NaryChecked
    Reduce func(operatorIdentity uint8, operator func(uint8, uint8) (uint8, error), elements ...uint8) (uint8, error)
}{
    Unary: uint8UnaryChecked{},

    Binary: uint8BinaryChecked{
        Add: uint8BinaryCheckedAdd,
        Sub: uint8BinaryCheckedSub,
        Mul: uint8BinaryCheckedMul,
        Div: uint8BinaryCheckedDiv,
        Shl: uint8BinaryCheckedShl,
    },

    Nary: uint8NaryChecked{
        Add: uint8NaryCheckedAdd,
        Mul: uint8NaryCheckedMul,
    },

    Reduce: uint8CheckedReduce,
}

UintChecked implements operations on one (unary), two (binary), or many (nary) arguments of type uint, returning an error in cases such as overflow or an undefined operation.

var UintChecked = struct {
    Unary  uintUnaryChecked
    Binary uintBinaryChecked
    Nary   uintNaryChecked
    Reduce func(operatorIdentity uint, operator func(uint, uint) (uint, error), elements ...uint) (uint, error)
}{
    Unary: uintUnaryChecked{},

    Binary: uintBinaryChecked{
        Add: uintBinaryCheckedAdd,
        Sub: uintBinaryCheckedSub,
        Mul: uintBinaryCheckedMul,
        Div: uintBinaryCheckedDiv,
        Shl: uintBinaryCheckedShl,
    },

    Nary: uintNaryChecked{
        Add: uintNaryCheckedAdd,
        Mul: uintNaryCheckedMul,
    },

    Reduce: uintCheckedReduce,
}

Subdirectories

Name Synopsis
examples
calculator Using operators in lookup tables for a command-line calculator program
simple Using operators as function arguments