Is this method pure?
Posted
by
Thomas Levesque
on Programmers
See other posts from Programmers
or by Thomas Levesque
Published on 2014-05-26T19:23:18Z
Indexed on
2014/05/26
21:59 UTC
Read the original article
Hit count: 372
c#
I have the following extension method:
public static IEnumerable<T> Apply<T>(
[NotNull] this IEnumerable<T> source,
[NotNull] Action<T> action)
where T : class
{
source.CheckArgumentNull("source");
action.CheckArgumentNull("action");
return source.ApplyIterator(action);
}
private static IEnumerable<T> ApplyIterator<T>(this IEnumerable<T> source, Action<T> action)
where T : class
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
It just applies an action to each item of the sequence before returning it.
I was wondering if I should apply the Pure
attribute (from Resharper annotations) to this method, and I can see arguments for and against it.
Pros:
- strictly speaking, it is pure; just calling it on a sequence doesn't alter the sequence (it returns a new sequence) or make any observable state change
- calling it without using the result is clearly a mistake, since it has no effect unless the sequence is enumerated, so I'd like Resharper to warn me if I do that.
Cons:
- even though the
Apply
method itself is pure, enumerating the resulting sequence will make observable state changes (which is the point of the method). For instance,items.Apply(i => i.Count++)
will change the values of the items every time it's enumerated. So applying the Pure attribute is probably misleading...
What do you think? Should I apply the attribute or not?
© Programmers or respective owner