groovy-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Ledbrook <pe...@cacoethes.co.uk>
Subject Re: CharSequence.count(Closure)
Date Wed, 27 May 2015 16:43:26 GMT
For reference, the discussion continued on the corresponding JIRA issue:

    https://issues.apache.org/jira/browse/GROOVY-7432

Peter

On Sat, 23 May 2015 at 11:33 Paul King <paulk@asert.com.au> wrote:

>
> Yes, it would be StringGroovyMethods. For better or worse, the current
> iterable-like
> methods in SGM (dropWhile, collectReplacements, takeWhile) pass a char
> into the Closure.
> Here is the little experiment I did for count:
>
>      /**
>       * Counts the number of occurrences which satisfy the given closure
> from the chars within this CharSequence.
>       * <p/>
>       * Example usage:
>       * <pre class="groovyTestCase">
>       * assert "hello".count{ "aeiou".contains(it as String) } == 2
>       * assert "hello".count{ String s -> "aeiou".contains(s) } == 2
>       * </pre>
>       *
>       * @param self      the CharSequence within which we count the number
> of occurrences
>       * @param condition a closure condition which is passed each
> character (or String of size 1 if the closure takes a String argument)
>       * @return the number of occurrences
>       * @since 2.5.0
>       */
>      public static <T> Number count(CharSequence self,
> @ClosureParams(value=SimpleType.class, options="char") Closure condition) {
>          int index = 0;
>          int result = 0;
>          boolean stringArg = condition.getMaximumNumberOfParameters() == 1
> && condition.getParameterTypes()[0].equals(String.class);
>          BooleanClosureWrapper bcw = new BooleanClosureWrapper(condition);
>          while (index < self.length()) {
>              char value = self.charAt(index);
>              if (bcw.call(stringArg ? Character.toString(value) : value)) {
>                  result++;
>              }
>              index++;
>          }
>          return result;
>      }
>
> This passes char in as the default but also will pass a String of size 1
> if the provided
> closure has one String arg - see the examples in the GroovyDoc.  Actually,
> in hindsight,
> I would have made String of size 1 the default and char the thing to
> optionally look for.
> But for consistency, not sure whether it is good to change that decision
> now.  Then again,
> if we want to make such a change we should do it before 2.5.0 and before
> we add a bunch
> more methods.
>
> Cheers, Paul.
>
> On 23/05/2015 7:22 PM, Peter Ledbrook wrote:
> >     Currently you'd need to do something like:
> >
> >     "hello".iterator().count{ "aeiou".contains(it) }
> >
> >     I think it makes sense to add a direct DGM method in this instance.
> >     And yes, I suspect that CharSequence versions of most of the Iterable
> >     DGM methods would be appropriate.
> >
> >
> > Should these go in DGM or StringGroovyMethods? I'm thinking the simplest
> solution would be implementations of the form:
> >
> >      static int count(CharSequence seq, Closure cl) {
> >          return count(seq.iterator(), cl);
> >      }
> >
> > Does that make sense?
> >
> > Peter
>
>
> ---
> This email has been checked for viruses by Avast antivirus software.
> http://www.avast.com
>
>

Mime
View raw message