From c4dfaed19c278806ef395def1120b66992b3e33e Mon Sep 17 00:00:00 2001 From: Michel Hermier Date: Mon, 28 Dec 2020 13:00:06 +0100 Subject: [PATCH] wren/core: Add `Sequence::find`. --- doc/site/modules/core/sequence.markdown | 7 +++++++ src/vm/wren_core.wren | 10 ++++++++++ src/vm/wren_core.wren.inc | 10 ++++++++++ test/core/sequence/find.wren | 8 ++++++++ 4 files changed, 35 insertions(+) create mode 100644 test/core/sequence/find.wren diff --git a/doc/site/modules/core/sequence.markdown b/doc/site/modules/core/sequence.markdown index 94ee5d93d..f378f9f5d 100644 --- a/doc/site/modules/core/sequence.markdown +++ b/doc/site/modules/core/sequence.markdown @@ -66,6 +66,13 @@ Iterates over the sequence, passing each element to the given `function`. ["one", "two", "three"].each {|word| System.print(word) } +### **find**(predicate), **find**(it, predicate) + +Returns an iterator on the sequence that pass the function `predicate`, +starting from the begining of the sequence or `it` if provided. + +It is a runtime error if `it` is not a valid iterator value on the sequence. + ### **isEmpty** Returns whether the sequence contains any elements. diff --git a/src/vm/wren_core.wren b/src/vm/wren_core.wren index 58033e7cc..9b684c622 100644 --- a/src/vm/wren_core.wren +++ b/src/vm/wren_core.wren @@ -52,6 +52,16 @@ class Sequence { } } + find(predicate) { find(iterate(null), predicate) } + + find(it, predicate) { + while(it) { + if (predicate.call(iteratorValue(it))) break + it = iterate(it) + } + return it + } + isEmpty { iterate(null) ? false : true } map(transformation) { MapSequence.new(this, transformation) } diff --git a/src/vm/wren_core.wren.inc b/src/vm/wren_core.wren.inc index 4b706f428..ec753c2a9 100644 --- a/src/vm/wren_core.wren.inc +++ b/src/vm/wren_core.wren.inc @@ -54,6 +54,16 @@ static const char* coreModuleSource = " }\n" " }\n" "\n" +" find(predicate) { find(iterate(null), predicate) }\n" +"\n" +" find(it, predicate) {\n" +" while(it) {\n" +" if (predicate.call(iteratorValue(it))) break\n" +" it = iterate(it)\n" +" }\n" +" return it\n" +" }\n" +"\n" " isEmpty { iterate(null) ? false : true }\n" "\n" " map(transformation) { MapSequence.new(this, transformation) }\n" diff --git a/test/core/sequence/find.wren b/test/core/sequence/find.wren new file mode 100644 index 000000000..aea40d11d --- /dev/null +++ b/test/core/sequence/find.wren @@ -0,0 +1,8 @@ + +var data = 0...100 + +System.print(data.find {|value| value == -1 }) // expect: false +System.print(data.iteratorValue(data.find {|value| value == 42 })) // expect: 42 +System.print(data.find {|value| value == 100 }) // expect: false + +System.print(data.iteratorValue(data.find(data.find {|value| value == 42 }) {|value| value %15 == 0})) // expect: 45