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: 447
        
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 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?
© Programmers or respective owner