@@ -6,26 +6,29 @@ import java.io.Writer
6
6
7
7
@Throws(IOException ::class )
8
8
fun generate (reader : Reader , writer : Writer ) {
9
- val valuableCustomers = reader.readLines()
10
- .withoutHeader()
11
- .map(String ::toCustomerData)
12
- .filter { it.score >= 10 }
9
+ val valuableCustomers = reader
10
+ .readLines()
11
+ .toValuableCustomers()
13
12
.sortedBy(CustomerData ::score)
14
13
writer.appendLine(" ID\t Name\t Spend" )
15
14
for (customerData in valuableCustomers) {
16
- writer.appendLine(lineFor( customerData) )
15
+ writer.appendLine(customerData.outputLine )
17
16
}
18
17
writer.append(valuableCustomers.summarised())
19
18
}
20
19
20
+ private fun List<String>.toValuableCustomers () = withoutHeader()
21
+ .map(String ::toCustomerData)
22
+ .filter { it.score >= 10 }
23
+
21
24
private fun List<String>.withoutHeader () = drop(1 )
22
25
23
26
private fun List<CustomerData>.summarised (): String =
24
27
sumByDouble { it.spend }.let { total ->
25
28
" \t TOTAL\t ${total.toMoneyString()} "
26
29
}
27
30
28
- fun String.toCustomerData (): CustomerData =
31
+ internal fun String.toCustomerData (): CustomerData =
29
32
split(" \t " ).let { parts ->
30
33
CustomerData (
31
34
id = parts[0 ],
@@ -36,8 +39,9 @@ fun String.toCustomerData(): CustomerData =
36
39
)
37
40
}
38
41
39
- private fun lineFor (customer : CustomerData ): String =
40
- " ${customer.id} \t ${customer.marketingName} \t ${customer.spend.toMoneyString()} "
42
+
43
+ private val CustomerData .outputLine: String
44
+ get() = " $id \t $marketingName \t ${spend.toMoneyString()} "
41
45
42
46
private fun Double.toMoneyString () = this .formattedAs(" %#.2f" )
43
47
0 commit comments