anchor.diff:        (acceptNegativeInfinity && parsed.toString() == double.NEGATIVE_INFINITY.toString());
   }
   
  -bool isNum(String s, {
  +bool isNum(dynamic s, {
     bool acceptInfinity: false,
     bool acceptNegativeInfinity: false}) {
     if(s == null) return false;
  +  if(s is num) {
  +    return (s != double.INFINITY || s == double.INFINITY && acceptInfinity) ||
  +                  (s != double.NEGATIVE_INFINITY || s == double.NEGATIVE_INFINITY && acceptNegativeInfinity);
  +  }
  +  if(s is !String) return false;
     return parseNum(s,
          onErrorDefault: null,
          acceptInfinity: acceptInfinity,
  
positive.code:   return result;
  }
  
  num parseNum(String s, {num onErrorDefault: null,
    bool acceptInfinity: false,
    bool acceptNegativeInfinity: false}) {
  
    if(s == null) return onErrorDefault;
  
    if(acceptInfinity && s.toLowerCase() == double.INFINITY.toString().toLowerCase()) {
      return double.INFINITY;
  
negative.code: library bwu_utils.parse_num;
  
  bool isInt(dynamic s, {int radix: 10}) { // TODO test after change to dynamic
    if(s == null) return false;
    if(s is int) return true;
    if(s is !String) return false;
    return parseInt(s, onErrorDefault: null) is int;
  }
  
  bool isDouble(dynamic s, {
    bool acceptInfinity: false,
    bool acceptNegativeInfinity: false}) {
    if(s == null) return false;
    if(s is num) {
      return (s != double.INFINITY || s == double.INFINITY && acceptInfinity) ||
                    (s != double.NEGATIVE_INFINITY || s == double.NEGATIVE_INFINITY && acceptNegativeInfinity);
    }
    if(s is !String) return false;
    num parsed = parseNum(s,
        onErrorDefault: null,
        acceptInfinity: acceptInfinity,
  