Skip to content

Instantly share code, notes, and snippets.

@fgoinai
Created May 30, 2017 14:27
Show Gist options
  • Save fgoinai/0ad5a04a0adf847abf9a56f17e1418ae to your computer and use it in GitHub Desktop.
Save fgoinai/0ad5a04a0adf847abf9a56f17e1418ae to your computer and use it in GitHub Desktop.
fun <T: Comparable<T>> eWhen(target: T, tester: Tester<T>.() -> Unit) {
val test = Tester(target)
test.tester()
test.filterList.firstOrNull { it.filter }?.invoke() ?: return
}
class Tester<T: Comparable<T>>(val it: T) {
val filterList = mutableListOf<Filter>()
class Filter(val filter: Boolean, val block: () -> Unit) {
operator fun invoke() = block()
}
fun lt(arg: T, block: () -> Unit) = filterList.add(Filter(it < arg, block))
fun gt(arg: T, block: () -> Unit) = filterList.add(Filter(it > arg, block))
fun ge(arg: T, block: () -> Unit) = filterList.add(Filter(it >= arg, block))
fun le(arg: T, block: () -> Unit) = filterList.add(Filter(it <= arg, block))
fun eq(arg: T, block: () -> Unit) = filterList.add(Filter(it == arg, block))
fun ne(arg: T, block: () -> Unit) = filterList.add(Filter(it != arg, block))
fun ct(arg: Collection<T>, block: () -> Unit) = filterList.add(Filter(it in arg, block))
fun nc(arg: Collection<T>, block: () -> Unit) = filterList.add(Filter(it !in arg, block))
}
//Demo
fun main(args: Array<String>) {
eWhen(1) {
lt(5) { println("fuck") }
gt(10) { println("fuck 2")}
}
eWhen("fu") {
ct("fuck") {println("fuck again")}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment