initStdMath method

void initStdMath()

Implementation

void initStdMath() {
  final defMath =
      LuaObject.table('math', {
          'abs': LuaFuncBuilder.create('abs')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x.abs();
                },
              ),
          'acos': LuaFuncBuilder.create('acos')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.acos(x);
                },
              ),
          'asin': LuaFuncBuilder.create('asin')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.asin(x);
                },
              ),
          'atan': LuaFuncBuilder.create('atan')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.atan(x);
                },
              ),
          'atan2': LuaFuncBuilder.create('atan2')
              .arg('y')
              .arg('x')
              .exec(
                call: () {
                  final y = findVar('y')?.valueAs<num>();
                  if (y == null) {
                    throw 'Expected num argument "y" for "${context!.id}".';
                  }

                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }

                  return math.atan2(y, x);
                },
              ),
          'ceil': LuaFuncBuilder.create('ceil')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x.ceil();
                },
              ),
          'cos': LuaFuncBuilder.create('cos')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.cos(x);
                },
              ),
          'sin': LuaFuncBuilder.create('sin')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.sin(x);
                },
              ),
          'tan': LuaFuncBuilder.create('tan')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.tan(x);
                },
              ),
          'cosh': LuaFuncBuilder.create('cosh')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x; // TODO
                },
              ),
          'sinh': LuaFuncBuilder.create('sinh')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x; // TODO
                },
              ),
          'tanh': LuaFuncBuilder.create('tanh')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x; // TODO
                },
              ),
          'deg': LuaFuncBuilder.create('deg')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x * 180.0 / math.pi;
                },
              ),
          'rad': LuaFuncBuilder.create('rad')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x * math.pi / 180.0;
                },
              ),
          'exp': LuaFuncBuilder.create('exp')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.exp(x);
                },
              ),
          'floor': LuaFuncBuilder.create('floor')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x.floor();
                },
              ),
          'fmod': LuaFuncBuilder.create('fmod')
              .arg('x')
              .arg('y')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  final y = findVar('y')?.valueAs<num>();
                  if (y == null) {
                    throw 'Expected num argument "y" for "${context!.id}".';
                  }
                  return x; // TODO: math.fmod(x / y);
                },
              ),
          'frexp': LuaFuncBuilder.create('frexp')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x; // TODO
                },
              ),
          // TODO: math.huge
          'log': LuaFuncBuilder.create('log')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.log(x);
                },
              ),
          'log10': LuaFuncBuilder.create('log10')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return x; // TODO
                },
              ),
          'pow': LuaFuncBuilder.create('pow')
              .arg('x')
              .arg('y')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }

                  final y = findVar('y')?.valueAs<num>();
                  if (y == null) {
                    throw 'Expected num argument "y" for "${context!.id}".';
                  }

                  return math.pow(x, y);
                },
              ),
          'sqrt': LuaFuncBuilder.create('sqrt')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return math.sqrt(x);
                },
              ),
          'max': LuaFuncBuilder.create('max')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }

                  final varargs = findVarArgs()
                      ?.map(
                        (e) => switch (e.valueAs<num>()) {
                          final num n => n,
                          _ =>
                            throw 'Expected number arguments for "${context!.id}".',
                        },
                      )
                      .toList();

                  if ((varargs ?? []).isEmpty) return x;

                  return varargs!.fold(x, (v, n) => math.max(v, n));
                },
              ),
          'min': LuaFuncBuilder.create('min')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }

                  final varargs = findVarArgs()
                      ?.map(
                        (e) => switch (e.valueAs<num>()) {
                          final num n => n,
                          _ =>
                            throw 'Expected number arguments for "${context!.id}".',
                        },
                      )
                      .toList();

                  if ((varargs ?? []).isEmpty) return x;

                  return varargs!.fold(x, (v, n) => math.min(v, n));
                },
              ),
          // Does nothing atm.
          'randomseed': LuaFuncBuilder.create('randomseed')
              .arg('x')
              .exec(
                call: () {
                  final x = findVar('x')?.valueAs<num>();
                  if (x == null) {
                    throw 'Expected num argument "x" for "${context!.id}".';
                  }
                  return null;
                },
              ),
          'random': LuaFuncBuilder.create('random')
              .arg('m')
              .arg('n')
              .exec(
                call: () {
                  final m = findVar('m')?.valueAs<num>()?.toInt();
                  final n = findVar('n')?.valueAs<num>()?.toInt();

                  if (m != null) {
                    if (n != null) {
                      final m0 = math.min(m, n);
                      final n0 = math.max(m, n);
                      return math.Random().nextInt(n0 - m0) + m0 + 1;
                    } else {
                      return math.Random().nextInt(m) + 1;
                    }
                  }

                  return math.Random().nextDouble();
                },
              ),
        })
        ..doc = LuaDoc(
          category: 'Runtime',
          html: '''
          The lua runtime math library.
          ''',
        );

  defGlobal(defMath);
}