In several different places in my application, I need to take a Seq[SalesRow] and return a Map[String,SalesRow], where the string is the name of a country.
I need to use this in several places. For example, I take a list of all SalesRows and get a global breakdown of sales by country. But in other places, I want to break down my sales by month and then by country (so Map[Month,Seq[SalesRow]] becomes Map[Month,Map[String,Seq[SalesRow]]]) – in still other places, I want to break down by day and then by country.
My question is: where do I put the (small) amount of logic that takes a Seq[SalesRow] and returns a map of countries to rows? Right now, I’m putting it in a companion object method, SalesRow.byCountry(rows : Seq[SalesReport]. Is that optimal?
A slightly crazier idea occurred to me, which is to create an implicit conversion from Seq[SalesRow] to EnhancedSalesRowSeq, which has a byCountry instance method. This appeals to me, because the operation is applicable to any sequence of SalesRows.
Is this a good idea?
Is adding the logic to the companion object my best choice, or are there better options?
Thanks.
In case you are not aware the library comes with a
groupByfunction. Basically given aSeq[SalesRow]it will give you aMap[T, Seq[SalesRow]]based on a function fromSalesRowtoT.So if your function is easy you can easily get a map. I do like your idea of the enhanced seq in conjunction with putting the implicit in the
SalesRowcompanion: