quiver.iterablesの関数

quiverというパッケージには色々と便利な関数があるので、試してみました

quiver.iterables library - Dart API

quiver - Dart API docs

関数

concat

iterablesを連結します。

// concat<T>(Iterable<Iterable<T>> iterables) → Iterable<T>
print(concat([
  [1, 2, 3],
  [-1, -2, -3]
]));
// (1, 2, 3, -1, -2, -3)

count

数値を加算して、iterablesを生成します。

// count([num start = 0, num step = 1 ]) → Iterable<num>
print(count().first);
// 0
print(count().take(5));
// (0, 1, 2, 3, 4)
print(count(3).take(5));
// (3, 4, 5, 6, 7)
print(count(3, 2).take(5));
// (3, 5, 7, 9, 11)

cycle

iterablesを循環させながら、iterablesを生成します。

// cycle<T>(Iterable<T> iterable) → Iterable<T>
print(cycle([1, 2, 3]).take(7));
// (1, 2, 3, 1, 2, 3, 1)

enumerate

iterableを入力すると、indexとvalueを扱えるiterableを生成します。

// enumerate<E>(Iterable<E> iterable) → Iterable<IndexedValue<E>>
var e = enumerate(['a', 'b', 'c']);
for (var item in e) {
  print("${item.index}, ${item.value}");
}
// 0, a
// 1, b
// 2, c
print(e.first.index); // 0
print(e.first.value); // a
print(e.last.index); // 2
print(e.last.value); // c
print(e.length); // 3

generate

initial()とnext()をもとに、iterableを生成します。

// generate(dynamic initial(), dynamic next(dynamic o)) → Iterable
print(generate(() => 'Hello', (n) => '$n!'));
// (Hello, Hello!, Hello!!, Hello!!!, Hello!!!!, Hello!!!!!, Hello!!!!!!, ...)

min, max, extent

最小値、最大値、最小値と最大値。

// min<T>(Iterable<T> i, [ Comparator<T> compare ]) → T
print(min([2, 5, 1, 4]).toString());
// 1

// max<T>(Iterable<T> i, [ Comparator<T> compare ]) → T
print(max([2, 5, 1, 4]).toString());
// 5

// extent<T>(Iterable<T> i, [ Comparator<T> compare ]) → Extent<T>
var ext = extent([2, 5, 1, 4]);
print(ext.min); // 1
print(ext.max); // 5

merge

iterableを併合します。
前提は、入力のiterableがソート済みであること。

// merge<T>(Iterable<Iterable<T>> iterables, [ Comparator<T> compare ]) → Iterable<T>
var a = ['a', 'a', 'd', 'f'];
var b = ['b', 'c', 'g', 'g'];
print(merge([a, b]));
// ['a', 'a', 'b', 'c', 'd', 'f', 'g', 'g']

// This function assumes the provided iterables are already sorted according to the provided compare function. It will not check for this condition or sort the iterables.
var x = ['6', '1', '5'];
var y = ['3', '2', '4'];
print(merge([x, y]));
// [3, 2, 4, 6, 1, 5]
print(merge([x..sort(), y..sort()]));
// [1, 2, 3, 4, 5, 6]

partition

iterableを指定サイズのリストに分割します。

// partition<T>(Iterable<T> iterable, int size) → Iterable<List<T>>
print(partition([1, 2, 3, 4, 5], 3));
// ([1, 2, 3], [4, 5])
print(partition([1, 2, 3, 4, 5, 6, 7, 8, 9], 3));
// ([1, 2, 3], [4, 5, 6], [7, 8, 9])

range

指定した範囲の数値列を生成します。

// range(num start_or_stop, [ num stop, num step ]) → Iterable<num>
print(range(0, 10));
// (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(range(0, 10, 2));
// (0, 2, 4, 6, 8)

zip

すべてのIterableのn番目の要素を、n番目の要素として合わせ持つリストを生成します。

// zip<T>(Iterable<Iterable<T>> iterables) → Iterable<List<T>>
print(zip([
  [1, 2, 3],
  ['a', 'b', 'c']
]));
// ([1, a], [2, b], [3, c])

編集後記

最初は関数の定義を見ても、使い方がよくわからりませんでした。

zip<T>(Iterable<Iterable<T>> iterables)  Iterable<List<T>>

「Iterable<Iterable> iterables」って、めっちゃiterables多いな。みたいな感じでした。
そして、周りに聞ける人もいない。

あれ?
もしかしてGitHubのtestフォルダーを見れば、使い方がわかるのでは?

見た。

GitHub - google/quiver-dart: A set of utility libraries for Dart

わかった

きっと世の中のできる人は、一次情報をちゃんと見てるんでしょうね。

学び

  • quiver.iterablesには便利な関数がある
  • パッケージは、GitHubのtestやexampleのコードを見ると、使い方をわかる場合がある
  • いくつかの関数はPythonの関数に似ている。GitHubのREADMEにもそう書いてある

concat, count, cycle, enumerate, merge, partition, range, and zip create, transform, or combine Iterables in different ways, similar to Python’s itertools.

GitHub - google/quiver-dart: A set of utility libraries for Dart


スポンサーリンク