Tower Guidev2
05/13/2021, 9:27 AMTower Guidev2
05/13/2021, 11:36 AMinterface Interaction<Input, Output> {interface Reaction<Output> : Interaction<Nothing, Output> {val output: Output}interface Action<Input, Output> : Interaction<Input, Output> {val input: Inputfun react(output: Output): Consequence<Class<out Action<Input, Output>>, Reaction<Output>>}}data class Consequence<out K : Class<out Interaction.Action<*, *>>, out R : Interaction.Reaction<*>>(val klass: K,val reaction: R)data class CustomInput(val whatever: String, val something: Double)data class CustomInputTwo(val kotlin: String, val future: Double, val space: Int)data class CustomOutput(val frank: Long, val homer: String)data class CustomOutputTwo(val geezer: Long, val su: String)sealed class Interactions<I, O> : Interaction<I, O> {data class ActionOne(override val input: String) : Interaction.Action<String, Long> {private data class ReactionOne(override val output: Long) : Interaction.Reaction<Long>override fun react(output: Long): Consequence<Class<out Interaction.Action<String, Long>>, Interaction.Reaction<Long>> =Consequence(this@ActionOne::class.java, ReactionOne(output))}data class ActionTwo(override val input: CustomInput) : Interaction.Action<CustomInput, CustomOutput> {private data class ReactionTwo(override val output: CustomOutput) : Interaction.Reaction<CustomOutput>override fun react(output: CustomOutput): Consequence<Class<out Interaction.Action<CustomInput, CustomOutput>>, Interaction.Reaction<CustomOutput>> =Consequence(this@ActionTwo::class.java, ReactionTwo(output))}data class ActionThree(override val input: Nothing? = null) : Interaction.Action<Nothing?, CustomOutputTwo> {private data class ReactionThree(override val output: CustomOutputTwo) : Interaction.Reaction<CustomOutputTwo>override fun react(output: CustomOutputTwo): Consequence<Class<out Interaction.Action<Nothing?, CustomOutputTwo>>, Interaction.Reaction<CustomOutputTwo>> =Consequence(this@ActionThree::class.java, ReactionThree(output))}data class ActionFour(override val input: Nothing? = null) : Interaction.Action<Nothing?, Nothing?> {private data class ReactionFour(override val output: Nothing? = null) : Interaction.Reaction<Nothing?>override fun react(output: Nothing?): Consequence<Class<out Interaction.Action<Nothing?, Nothing?>>, Interaction.Reaction<Nothing?>> =Consequence(this@ActionFour::class.java, ReactionFour())}data class ActionFive(override val input: CustomInputTwo) : Interaction.Action<CustomInputTwo, Nothing?> {private data class ReactionFive(override val output: Nothing? = null) : Interaction.Reaction<Nothing?>override fun react(output: Nothing?): Consequence<Class<out Interaction.Action<CustomInputTwo, Nothing?>>, Interaction.Reaction<Nothing?>> =Consequence(this@ActionFive::class.java, ReactionFive())}}InteractionsNothing?Tower Guidev2
05/13/2021, 11:36 AMfun main() = runBlocking {
    val controller = PrototypeViewModel()
    val interactions =
        listOf(
            Interactions.ActionOne("hi"),
            Interactions.ActionTwo(CustomInput(whatever = "Really???", something = Math.PI)),
            Interactions.ActionThree(),
            Interactions.ActionFour(),
            Interactions.ActionFive(CustomInputTwo(kotlin = "code", space = 8765, future = Math.E)),
        )
    interactions.forEach { action ->
        controller.call(action).collect { consequence ->
            when (consequence.klass) {
                Interactions.ActionOne::class.java -> println("\t\t ${consequence.reaction.output}")
                Interactions.ActionTwo::class.java -> println("\t\t ${consequence.reaction.output}")
                Interactions.ActionThree::class.java -> println("\t\t ${consequence.reaction.output}")
                Interactions.ActionFour::class.java -> println("\t\t ${consequence.reaction.output}")
                Interactions.ActionFive::class.java -> println("\t\t ${consequence.reaction.output}")
                else -> TODO("Noooooooooooooooo!!!!!!!!!!!!!")
            }
        }
    }
}zhuinden
05/17/2021, 9:59 PMTower Guidev2
05/18/2021, 7:19 AMTower Guidev2
05/18/2021, 7:45 AMTower Guidev2
05/20/2021, 9:40 AMzhuinden
05/20/2021, 9:43 AM