From c00d6ad6949119b810bd73afb01c6dcd2d6c5551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Sat, 28 Mar 2015 20:35:20 +0100 Subject: [PATCH] Added Sequence.each This is a bit of a style preference since of course you can always write the same thing with a for loop. However, I think sometimes the code looks better when using this method. It also provides an alternative to Sequence.map for cases where you don't need the resulting list, and one that becomes especially necessary when Sequence.map is changed to return a new sequence. The example in the README.md file was using Sequence.map in a way that required this alternative in that case. --- README.md | 2 +- builtin/core.wren | 6 ++++++ doc/site/core/sequence.markdown | 7 +++++++ doc/site/index.markdown | 4 ++-- src/vm/wren_core.c | 6 ++++++ test/core/list/each.wren | 3 +++ test/core/list/each_no_items.wren | 3 +++ test/core/list/each_non_function_arg.wren | 1 + 8 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 test/core/list/each.wren create mode 100644 test/core/list/each_no_items.wren create mode 100644 test/core/list/each_non_function_arg.wren diff --git a/README.md b/README.md index 75e49f0c..e35551e3 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ class Wren { } var adjectives = new Fiber { - ["small", "clean", "fast"].map {|word| Fiber.yield(word) } + ["small", "clean", "fast"].each {|word| Fiber.yield(word) } } while (!adjectives.isDone) IO.print(adjectives.call()) diff --git a/builtin/core.wren b/builtin/core.wren index a3722dd9..708cc4f4 100644 --- a/builtin/core.wren +++ b/builtin/core.wren @@ -26,6 +26,12 @@ class Sequence { return result } + each(f) { + for (element in this) { + f.call(element) + } + } + map(f) { var result = new List for (element in this) { diff --git a/doc/site/core/sequence.markdown b/doc/site/core/sequence.markdown index 807e6c84..62edb140 100644 --- a/doc/site/core/sequence.markdown +++ b/doc/site/core/sequence.markdown @@ -54,6 +54,13 @@ and counting the number of times the returned value evaluates to `true`. [1, 2, 3].count {|n| n > 2} // 1. [1, 2, 3].count {|n| n < 4} // 3. +### **each**(function) + +Iterates over the sequence, passing each element to the given `function`. + + :::dart + ["one", "two", "three"].each {|word| IO.print(word) } + ### **join**(sep) Returns a string representation of the list. The string representations of the diff --git a/doc/site/index.markdown b/doc/site/index.markdown index f6f1ef96..5cecebc5 100644 --- a/doc/site/index.markdown +++ b/doc/site/index.markdown @@ -15,7 +15,7 @@ a familiar, modern [syntax][]. } var adjectives = new Fiber { - ["small", "clean", "fast"].map {|word| Fiber.yield(word) } + ["small", "clean", "fast"].each {|word| Fiber.yield(word) } } while (!adjectives.isDone) IO.print(adjectives.call()) @@ -52,4 +52,4 @@ If you like the sound of this, [give it a try][try]! Even better, you can [fibers]: fibers.html [embedding]: embedding-api.html [try]: getting-started.html -[contribute]: contributing.html \ No newline at end of file +[contribute]: contributing.html diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index ea75e896..9878be4f 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -72,6 +72,12 @@ static const char* libSource = " return result\n" " }\n" "\n" +" each(f) {\n" +" for (element in this) {\n" +" f.call(element)\n" +" }\n" +" }\n" +"\n" " map(f) {\n" " var result = new List\n" " for (element in this) {\n" diff --git a/test/core/list/each.wren b/test/core/list/each.wren new file mode 100644 index 00000000..6629a498 --- /dev/null +++ b/test/core/list/each.wren @@ -0,0 +1,3 @@ +var words = "" +["One", "Two", "Three"].each {|word| words = words + word } +IO.print(words) // expect: OneTwoThree diff --git a/test/core/list/each_no_items.wren b/test/core/list/each_no_items.wren new file mode 100644 index 00000000..cc3754a9 --- /dev/null +++ b/test/core/list/each_no_items.wren @@ -0,0 +1,3 @@ +var i = 0 +[].each {|item| i = i + 1 } +IO.print(i) // expect: 0 diff --git a/test/core/list/each_non_function_arg.wren b/test/core/list/each_non_function_arg.wren new file mode 100644 index 00000000..101554f0 --- /dev/null +++ b/test/core/list/each_non_function_arg.wren @@ -0,0 +1 @@ +[1, 2, 3].each("string") // expect runtime error: String does not implement 'call(_)'.