methods method
Implementation
@override
Map<String, Function> methods() {
return {
'floor': (dynamic n) => _toNum(n)?.floor(),
'abs': (dynamic n) => _toNum(n)?.abs(),
'ceil': (dynamic n) => _toNum(n)?.ceil(),
'round': (dynamic n) => _toNum(n)?.round(),
'trunc': (dynamic n) => _toNum(n)?.truncate(),
'log': (dynamic n) => math.log(_toNum(n) ?? 1),
// Default to 1 to prevent log(0)
'pow': (dynamic x, dynamic y) => math.pow(_toNum(x) ?? 0, _toNum(y) ?? 0),
'acos': (dynamic n) => math.acos(_toNum(n) ?? 1),
'asin': (dynamic n) => math.asin(_toNum(n) ?? 0),
'atan': (dynamic x) => math.atan(_toNum(x) ?? 0),
'atan2': (dynamic a, dynamic b) =>
math.atan2(_toNum(a) ?? 0, _toNum(b) ?? 1),
'cos': (dynamic x) => math.cos(_toNum(x) ?? 0),
'exp': (dynamic x) => math.exp(_toNum(x) ?? 0),
'max': (List<dynamic> args) {
// Ensure all values are numbers and filter out nulls; then find the max value
var numbers = args.map(_toNum).whereType<num>().toList();
if (numbers.isEmpty) return double.negativeInfinity;
return numbers.reduce(math.max);
},
'min': (List<dynamic> args) {
// Ensure all values are numbers and filter out nulls; then find the min value
var numbers = args.map(_toNum).whereType<num>().toList();
if (numbers.isEmpty) return double.infinity;
return numbers.reduce(math.min);
},
'sin': (dynamic x) => math.sin(_toNum(x) ?? 0),
'sqrt': (List<dynamic> args) {
num val = 0;
if (args.length > 0) {
val = _toNum(args[0]);
}
return val.isNegative ? double.nan : math.sqrt(val);
},
'tan': (dynamic x) => math.tan(_toNum(x) ?? 0),
'random': () => math.Random().nextDouble(),
'sign': (dynamic x) {
num? v = _toNum(x);
if (v == null || v.isNaN) return double.nan;
if (v == 0) return 0;
return v > 0 ? 1 : -1;
},
'imul': (dynamic a, dynamic b) {
int ai = (_toNum(a) ?? 0).toInt();
int bi = (_toNum(b) ?? 0).toInt();
return (ai * bi) & 0xffffffff;
},
'clz32': (dynamic x) {
int v = (_toNum(x) ?? 0).toInt() & 0xffffffff;
return v == 0 ? 32 : v.toRadixString(2).padLeft(32, '0').indexOf('1');
},
};
}