package dev.bnorm.storyboard import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import kotlin.enums.enumEntries @DslMarker internal annotation class StoryboardBuilderDsl val DefaultEnterTransition: (AdvanceDirection) -> EnterTransition = { EnterTransition.None } val DefaultExitTransition: (AdvanceDirection) -> ExitTransition = { ExitTransition.None } @StoryboardBuilderDsl sealed interface StoryboardBuilder { @StoryboardBuilderDsl fun scene( states: List, enterTransition: (AdvanceDirection) -> EnterTransition = DefaultEnterTransition, exitTransition: (AdvanceDirection) -> ExitTransition = DefaultExitTransition, content: SceneContent, ): Scene @StoryboardBuilderDsl fun scene( stateCount: Int = 1, enterTransition: (AdvanceDirection) -> EnterTransition = DefaultEnterTransition, exitTransition: (AdvanceDirection) -> ExitTransition = DefaultExitTransition, content: SceneContent, ): Scene { require(stateCount >= 0) { "stateCount must be greater than or equal to 0" } return scene((0.. StoryboardBuilder.scene( vararg states: T, enterTransition: (AdvanceDirection) -> EnterTransition = DefaultEnterTransition, exitTransition: (AdvanceDirection) -> ExitTransition = DefaultExitTransition, content: SceneContent, ): Scene { return scene(states.asList(), enterTransition, exitTransition, content) } @StoryboardBuilderDsl inline fun > StoryboardBuilder.sceneForEnum( noinline enterTransition: (AdvanceDirection) -> EnterTransition = DefaultEnterTransition, noinline exitTransition: (AdvanceDirection) -> ExitTransition = DefaultExitTransition, content: SceneContent, ): Scene { return scene(enumEntries(), enterTransition, exitTransition, content) } @StoryboardBuilderDsl fun StoryboardBuilder.sceneForBoolean( enterTransition: (AdvanceDirection) -> EnterTransition = DefaultEnterTransition, exitTransition: (AdvanceDirection) -> ExitTransition = DefaultExitTransition, content: SceneContent, ): Scene { val states = listOf(false, true) return scene(states, enterTransition, exitTransition, content) } @StoryboardBuilderDsl fun StoryboardBuilder.sceneForTransition( enterTransition: (AdvanceDirection) -> EnterTransition = DefaultEnterTransition, exitTransition: (AdvanceDirection) -> ExitTransition = DefaultExitTransition, content: SceneContent, ): Scene { return scene(emptyList(), enterTransition, exitTransition, content) }