Writing Scala code, I regularly encounter cases where I have “processor” functions that operate iteratively on a collection of elements and also need to know the length of the collection.
On the other hand I have “provider” functions that generate collections and so already know the length. The generated collections may be List[T], Array[T] or Set[T], etc., but even in the case of List[T], my generator knows the size (even if the List type does not store it).
So I would naturally declare the “processor” functions as taking the most generic type that seems to fit all collection types, Iterable[T], as a parameter. However, they then internally need to find out the size via iterative collection traversal at a cost of O(N), which is undesirable.
So my naive solution would be to create a new type like IterableWithSize[T] and have the provider and processor functions create and take this type. Neither Seq[T] nor IndexedSeq[T] seem to fit the bill. But this seems like a relatively common use case, so I’m suspecting that there is a more idiomatic way to do this. What would that be?
I don’t think there is an idiomatic way to do this. But here are two alternatives:
(1) Extend Scala’s List/Set/Array collections and override the size method. This is not as difficult as it seems at first glance.
(2) Wrap your List/Set/Array collections together with the size and define an implicit unwrapper like: