class Profile(val name: String, val statusMessage: StatusMessage) data class StatusMessage(val text: String, val updatedTime: Long) fun createStatusMessageTextLens(): Lens<User, String> { val profileLens = Lens<User, Profile>( getter = { source -> source.profile }, setter = { source, map -> source.copy(profile = map(source.profile)) } ) val statusMessageLens = Lens<Profile, StatusMessage>( getter = { source -> source.statusMessage }, setter = { source, map -> source.copy(statusMessage = map(source.statusMessage)) } ) val textLens = Lens<StatusMessage, String>( getter = { source -> source.text }, setter = { source, map -> source.copy(text = map(source.text)) } ) return profileLens + statusMessageLens + textLens }