@@ -806,6 +806,52 @@ val config = OtherConfig("www.example.com", 1000, 10000, true)
806
806
downloadAsync(config* , retry = true )
807
807
```
808
808
809
+ Each of the above scenarios is a concrete use case for ` unpack ` and ` * ` : I expect it to be common
810
+ to use ` unpack ` at a definition site without ` * ` at the callsite, and similarly common to use ` * `
811
+ at a callsite without an ` unpack ` at the definition site. So we should support the two keywords
812
+ being used separately or together, and not mandate than a ` * ` must correspond to an matching
813
+ ` unpack ` .
814
+
815
+ ### Binary Compatibility
816
+
817
+ An important property of ` unpack ` is that it can be added or removed after the fact to an existing
818
+ method without breaking binary compatibility. For example I should be able to go from existing
819
+ methods with separate parameters To methods with a shared parameters via ` unpack ` without breaking
820
+ binary compatibility:
821
+
822
+ ** Before**
823
+ ``` scala
824
+
825
+ def downloadSimple (url : String ,
826
+ connectTimeout : Int ,
827
+ readTimeout : Int ) = doSomethingWith(config)
828
+ def downloadAsync (url : String ,
829
+ connectTimeout : Int ,
830
+ readTimeout : Int ,
831
+ ec : ExecutionContext ) = doSomethingWith(config)
832
+ def downloadStream (url : String ,
833
+ connectTimeout : Int ,
834
+ readTimeout : Int ) = doSomethingWith(config)
835
+ ```
836
+
837
+ ** After**
838
+ ``` scala
839
+ case class RequestConfig (url : String ,
840
+ connectTimeout : Int ,
841
+ readTimeout : Int )
842
+
843
+ def downloadSimple (unpack config : RequestConfig ) = doSomethingWith(config)
844
+ def downloadAsync (unpack config : RequestConfig , ec : ExecutionContext ) = doSomethingWith(config)
845
+ def downloadStream (unpack config : RequestConfig ) = doSomethingWith(config)
846
+ ```
847
+
848
+ This is important because it is an exceedingly common workflow as a library evolves: nobody
849
+ knows up front exactly how all their parameter lists will evolve over time, and so nobody will
850
+ be able to design the perfect ` unpack ` structure up front to decide which methods will need
851
+ to share what parameters with which other methods. A user thus needs to be able to consolidate
852
+ parameter lists into ` unpack ` parameters without breaking binary compatibility.
853
+
854
+
809
855
### Case Class Construction Semantics
810
856
811
857
` unpack ` may-or-may-not re-create a ` case class ` instance passed via ` config* ` to an
0 commit comments