tokenizer function

List<Token> tokenizer([
  1. dynamic obj,
  2. TokenMetaData? metadata
])

Implementation

List<Token> tokenizer([dynamic obj, TokenMetaData? metadata]) {
  if (obj == null) {
    return [];
  }

  if (obj is List) {
    return obj.map((t) {
      return Token(Utils.asString(t).toLowerCase(), Utils.clone(metadata));
    }).toList();
  }
  // if (obj is Map) {
  //   return obj.entries.fold<List<Token>>(
  //       [],
  //       (accum, e) => accum
  //         ..addAll([
  //           Token(Utils.asString(e.key), Utils.clone(metadata)),
  //           Token(Utils.asString(e.value), Utils.clone(metadata))
  //         ]));
  // }

  String str = Utils.asString(obj).toLowerCase();
  int len = str.length;
  List<Token> tokens = [];

  for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {
    String char = sliceEnd < len ? str[sliceEnd] : '';
    int sliceLength = sliceEnd - sliceStart;

    if (separator.hasMatch(char) || sliceEnd == len) {
      if (sliceLength > 0) {
        TokenMetaData tokenMetadata = Utils.clone(metadata) ?? {};
        tokenMetadata["position"] = [sliceStart, sliceLength];
        tokenMetadata["index"] = tokens.length;

        tokens.add(Token(str.substring(sliceStart, sliceEnd), tokenMetadata));
      }

      sliceStart = sliceEnd + 1;
    }
  }

  return tokens;
}