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
Applymethod 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?