Skip to content

Instantly share code, notes, and snippets.

@mrmans0n
Created May 18, 2022 14:56
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mrmans0n/cc5fbbdb5ec89cc4d014ec368d6a0b20 to your computer and use it in GitHub Desktop.
Save mrmans0n/cc5fbbdb5ec89cc4d014ec368d6a0b20 to your computer and use it in GitHub Desktop.
Simple example that allows you to add 2 PreviewParameterProviders to a Compose preview
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import kotlin.reflect.KClass
/**
* Creates a [PreviewParameterProvider] based on the classes of two existing providers.
*
* You can create your own easily with Kotlin delegation:
* ```
* class ExampleProvider : PreviewParameterProvider<Pair<Type1, Type2>>
* by compositeProvider(Type1ParameterProvider::class, Type2ParameterProvider::class)
* ```
*/
fun <T1 : Any, T2 : Any> compositeProvider(
kClass1: KClass<out PreviewParameterProvider<T1>>,
kClass2: KClass<out PreviewParameterProvider<T2>>
): PreviewParameterProvider<Pair<T1, T2>> = CompositeParameterProvider(kClass1, kClass2)
private class CompositeParameterProvider<T1 : Any, T2 : Any>(
kClass1: KClass<out PreviewParameterProvider<T1>>,
kClass2: KClass<out PreviewParameterProvider<T2>>
) : PreviewParameterProvider<Pair<T1, T2>> {
private val provider1 = kClass1.java.newInstance()
private val provider2 = kClass2.java.newInstance()
override val values: Sequence<Pair<T1, T2>>
get() = provider1.values union provider2.values
}
private infix fun <T1 : Any, T2 : Any> Sequence<T1>.union(
sequence: Sequence<T2>
): Sequence<Pair<T1, T2>> = flatMap { original -> sequence.map { original to it } }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment