Zen言語の標準ライブラリ紹介〜progress〜

はじめに

けっこう標準ライブラリが充実しているわけですが、ドキュメントがないのがもったいないですね。 まとまった時間が取れないので、ちょこちょこ書いていくシリーズです。

リクエストあれば、優先する、かも?

今日はコンソールにプログレスバーを表示する機能、いってみましょう。

std.progress

a, b, c, dという4つのタスクがあり、各タスクの進捗率を1から100で表示したいとします。 例えば、次の画像のイメージです。

f:id:tomo-wait-for-it-yuki:20200228213831p:plain f:id:tomo-wait-for-it-yuki:20200228213828p:plain f:id:tomo-wait-for-it-yuki:20200228213825p:plain f:id:tomo-wait-for-it-yuki:20200228213822p:plain

コードは次のようにします。

const std = @import("std");
const Progress = std.Progress;
const testing = std.testing;

test "progress bar" {
    // Progress のインスタンス生成
    var progress = Progress{};

    // タスク名
    const tasks = [_][]const u8{
        "a",
        "b",
        "c",
        "d",
    };
    // タスク4つで `progress` を開始
    const root = try progress.start("", tasks.len);
    defer root.end();

    for (tasks) |task| {
        // 各タスクごとにトータル進捗を100で子ノード作成
        var node = root.start(task, 100);
        // 子ノードをアクティブに設定
        node.activate();
        for ([_]u1{0} ** 100) |_| {
            // 進捗を`1`進める
            node.completeOne();
            std.time.sleep(50 * std.time.millisecond);
        }
        node.end();
    }
}