Marc Knaup
01/09/2019, 12:53 PMinterface Inline<Type: Any, Wrapped> {
fun wrap(wrapped: Wrapped): Type
fun unwrap(): Wrapped
}
inline class Username(val wrapped: String): Inline<Username, String> // interface implemented by compiler
val username = Username("TEST")
// manual unwrap and wrap at every call-site
val adjustedUsername = Username(username.wrapped.toLowerCase())
// for all String-based inline types
fun <Type: Any> Inline<Type, String>.toLowerCase() =
wrap(unwrap().toLowerCase())
// easy!
val adjustedUsername = username.toLowerCase()