class Profile(val name: String, val statusMessage: StatusMessage) data class StatusMessage(val text: String, val updatedTime: Long) fun capitalizeStatusMessage(user: User): User = user.copy( profile = user.profile.copy( statusMessage = user.profile.statusMessage.copy( text = user.profile.statusMessage.text.uppercase() ) ) )
Set fun updateStatusMessage(user: User, newMessage: String): User = User.profile.statusMessage.text.set(user, newMessage) // Modify(Getter + Setter) fun capitalizeStatusMessage(user: User): User = User.profile.statusMessage.text.modify(user) { it.uppercase() }
(A) -> A): S fun set(source: S, focus: A): S = modify(source) { _: A -> focus } } data class User(val id: Int, val profile: Profile) fun setProfile(user: User, newProfile: Profile): User { val profileSetter = Setter<User, Profile> { source, map -> val modifiedProfile = map(source.profile) source.copy(profile = modifiedProfile) } return profileSetter.set(user, newProfile) }
class Profile(val name: String, val statusMessage: StatusMessage) data class StatusMessage(val text: String, val updatedTime: Long) fun createStatusMessageTextLens(): Lens<User, String> { … } fun myLens(user: User, newMessage: String) { val lens = createStatusMessageTextLens() val text: String = lens.get(user) val newUser1: User = lens.set(user, newMessage) val newUser2: User = lens.modify(user) { it.uppercase() } }
class Profile { abstract val name: String abstract val statusMessage: StatusMessage data class BasicProfile( override val name: String, override val statusMessage: StatusMessage) : Profile() data class PremiumProfile( override val name: String, override val statusMessage: StatusMessage, val nameDecorationMetadata: String) : Profile() } fun maybeSetNameDecorationMetadata(user: User, newMetadata: String): User = User.profile. ??? .set(user, newMetadata) w-FOTEBUBDMBTTΛѻ͏ۜͷؙͰͳ͍
modify(source: S, map: (focus: A) -> A): S override fun getOrNull(source: S): A? fun reverseGet(focus: A): S } wTFBMFEDMBTTͷΫϥε֊ͷදݱʹΘΕΔ wSFWFSTF(FU ͰϑΥʔΧε͔Βιʔε͕ߏஙՄೳ
data class PremiumProfile() : Profile() } val basicProfilePrism: Prism<Profile, Profile.BasicProfile> = Profile.basicProfile val premiumProfilePrism: Prism<Profile, Profile.PremiumProfile> = Profile.premiumProfile wαϒΫϥεͷΫϥε໊ͷ1SJTN͕ੜ͞ΕΔ
class Profile { abstract val name: String abstract val statusMessage: StatusMessage data class BasicProfile( override val name: String, override val statusMessage: StatusMessage) : Profile() data class PremiumProfile( override val name: String, override val statusMessage: StatusMessage, val nameDecorationMetadata: String) : Profile() } fun maybeSetNameDecorationMetadata(user: User, newMetadata: String): User = User.profile.premiumProfile.nameDecorationMetadata.set(user, newMetadata) wTFBMFEDMBTTΛ1SJTNͰѻ͏
override fun modify(source: S, map: (focus: A) -> A): S override fun reverseGet(focus: A): S override fun get(source: S): A } wͭͷܕͷؒͰɺใͷଛࣦແ͠ͷ૬ޓม͕Մೳ w-FOTͱ1SJTNͷ྆ํͷೳྗΛ࣋ͭ
statusMessageToPairIso: Iso<StatusMessage, Pair<String, Long >> = Iso( get = { it.text to it.updatedTime }, reverseGet = { StatusMessage(it.first, it.second) } ) @JvmInline value class UserId(val id: Int) fun UserId.getValue(): Int = UserId.id.get(this) fun Int.toUserId(): UserId = UserId.id.reverseGet(this) w*TPʹΑΔܕม