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: Input
fun 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
)
To test this out I have developed the following data classes and sealed classes
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())
}
}
This approach works however I would appreciate any feed back on how I could improve these classes
Especially how I could make the sealed class Interactions
more succinct
The features I would really like to factor out is having to use Nothing?
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