letIterableOrNull<T> function

Iterable<T>? letIterableOrNull<T>(
  1. dynamic input, {
  2. bool filterNulls = false,
  3. dynamic nullFallback,
})

Let's you convert input to an Iterable type if possible, or returns null if the conversion cannot be performed.

If filterNulls is true, the returned iterable will not contain any null values. If nullFallback is provided, it will be used as a fallback value for null values.

Implementation

Iterable<T>? letIterableOrNull<T>(
  dynamic input, {
  bool filterNulls = false,
  dynamic nullFallback,
}) {
  final nullable = isNullable<T>();
  if (!nullable && input == null) return null;
  dynamic decoded;
  if (input is String) {
    decoded = letIterableFromCsv(input);
  } else {
    decoded = input;
  }
  if (decoded is Iterable) {
    try {
      final a = decoded.map((e) {
        final result = letOrNull<T>(e) ?? letOrNull<T>(nullFallback);
        if (filterNulls) {
          if (!nullable && result == null) {
            return const _Empty();
          }
        }
        return result;
      });
      final b = a.where((e) => e != const _Empty());
      var c = b.map((e) => e as T);
      if (filterNulls) {
        c = c.where((e) => e != null);
      }
      return c;
    } catch (_) {}
  }
  return [input as T];
}