
Generates lenses for classes to simplify immutable state updates, using annotation processing. Supports data and sealed classes, enhancing code readability and maintainability.
An annotation processor that generates lens for Kotlin classes.
Lens make updating immutable state very easy by allowing you to write :
newState = state.setValue(AppState.users[action.index].address.street, action.newStreet)instead of
val newAddress = state.users[action.index].address.copy(street = action.newStreet)
val newUser = state.users[action.index].copy(address = newAddress)
val newUsers = state.users.toMutableList().apply { this[action.index] = newUser }
newState = state.copy(users = newUsers)plugins {
id("com.google.devtools.ksp") version "1.7.10-1.0.6"
}
//...
dependecies {
implementation("io.github.mr0xf00:lens-generator:0.1.0")
ksp("io.github.mr0xf00:lens-generator:0.1.0")
//for KMP prefer
//add("ksp<Target>", "io.github.mr0xf00:lens-generator:0.1.0")
}KMP is supported but only jvm and js targets are available for now.
Apply @GenerateLens your classes.
Only data classes and sealed classes/interfaces are supported for now.
val newInstance = MyClass.propertyName.nestedProperty.set(instance, value)
val value = MyClass.propertyName.get(instance)See sample app for example usage as well as SealedTest.kt for sealed hierarchies and GenericTest.kt for generic classes.
The sample app uses PersistentList from kotlinx.collections.immutable.
See Lens.kt for an example on how to write your own lens to support immutable collection modification.
An annotation processor that generates lens for Kotlin classes.
Lens make updating immutable state very easy by allowing you to write :
newState = state.setValue(AppState.users[action.index].address.street, action.newStreet)instead of
val newAddress = state.users[action.index].address.copy(street = action.newStreet)
val newUser = state.users[action.index].copy(address = newAddress)
val newUsers = state.users.toMutableList().apply { this[action.index] = newUser }
newState = state.copy(users = newUsers)plugins {
id("com.google.devtools.ksp") version "1.7.10-1.0.6"
}
//...
dependecies {
implementation("io.github.mr0xf00:lens-generator:0.1.0")
ksp("io.github.mr0xf00:lens-generator:0.1.0")
//for KMP prefer
//add("ksp<Target>", "io.github.mr0xf00:lens-generator:0.1.0")
}KMP is supported but only jvm and js targets are available for now.
Apply @GenerateLens your classes.
Only data classes and sealed classes/interfaces are supported for now.
val newInstance = MyClass.propertyName.nestedProperty.set(instance, value)
val value = MyClass.propertyName.get(instance)See sample app for example usage as well as SealedTest.kt for sealed hierarchies and GenericTest.kt for generic classes.
The sample app uses PersistentList from kotlinx.collections.immutable.
See Lens.kt for an example on how to write your own lens to support immutable collection modification.