simc / dartx

Superpowers for Dart. Collection of useful static extension methods.
https://pub.dev/packages/dartx
Apache License 2.0
1.09k stars 87 forks source link

Proposal: modifyWhere and modifyFirstWhere #117

Open VKBobyr opened 3 years ago

VKBobyr commented 3 years ago

I propose the following modifier functionality:

typedef Modifier<T> = T Function(T val);
typedef ConditionCheck<T> = bool Function(T val);

extension ModificationExtension<T> on Iterable<T> {
  Iterable<T> modifyWhere(
    ConditionCheck<T> shouldModify,
    Modifier<T> modifier,
  ) {
    return map((item) => shouldModify(item) ? modifier(item) : item);
  }

  Iterable<T> modifyFirstWhere(
    ConditionCheck<T> shouldModify,
    Modifier<T> modifier,
  ) {
    bool modified = false;
    return modifyWhere(
      (v) => !modified && shouldModify(v),
      (v) {
        modified = true;
        return modifier(v);
      },
    );
  }
}

void main() {
  final items = [1, 2, 3, 4, 5, 6];

  final a = items.modifyWhere((v) => v < 3, (i) => -i);
  final b = items.modifyFirstWhere((v) => v > 3, (i) => -i);

  print(a); // (-1, -2, 3, 4, 5, 6)
  print(b); // (1, 2, 3, -4, 5, 6)
}

Motivation

Very common operation when modifying certain items in a list.

komape commented 3 years ago

@VKBobyr Seems like you already have the code for that. Why don't you just open a pull request if you have the implementation ready?