From 606f283ad39df8d832a5a1b8a7e2fca0855fae32 Mon Sep 17 00:00:00 2001 From: Sijawusz Pur Rahnama Date: Thu, 10 Aug 2017 18:18:50 +0200 Subject: [PATCH] Added Dir#each_child iterator --- spec/std/dir_spec.cr | 15 +++++++++++++++ src/dir.cr | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/spec/std/dir_spec.cr b/spec/std/dir_spec.cr index e7bb8e10dda5..2d707612eb9c 100644 --- a/spec/std/dir_spec.cr +++ b/spec/std/dir_spec.cr @@ -277,6 +277,21 @@ describe "Dir" do filenames << filename end + filenames.includes?(".").should be_true + filenames.includes?("..").should be_true + filenames.includes?("dir_spec.cr").should be_true + end + + it "gets child iterator" do + filenames = [] of String + + iter = Dir.new(__DIR__).each_child + iter.each do |filename| + filenames << filename + end + + filenames.includes?(".").should be_false + filenames.includes?("..").should be_false filenames.includes?("dir_spec.cr").should be_true end diff --git a/src/dir.cr b/src/dir.cr index 3662ff54ef3c..34ed101600bb 100644 --- a/src/dir.cr +++ b/src/dir.cr @@ -100,6 +100,10 @@ class Dir end end + def each_child + ChildIterator.new(self) + end + # Returns an array containing all of the filenames except for `.` and `..` # in the given directory. def children : Array(String) @@ -305,6 +309,27 @@ class Dir self end end + + private struct ChildIterator + include Iterator(String) + + def initialize(@dir : Dir) + end + + def next + excluded = {".", ".."} + loop do + break unless entry = @dir.read + return entry unless excluded.includes?(entry) + end + stop + end + + def rewind + @dir.rewind + self + end + end end require "./dir/*"