Skip to content

Instantly share code, notes, and snippets.

@tieskedh
Created August 1, 2017 14:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tieskedh/ff31d5609fc3d53af4b074017bf52709 to your computer and use it in GitHub Desktop.
Save tieskedh/ff31d5609fc3d53af4b074017bf52709 to your computer and use it in GitHub Desktop.
// top level function
inline fun ifp(boolean: Boolean?, noinline statements: ()->Unit)
= NonReturningIfContinuation().ElseIfP(boolean, statements)
inline fun ifn(boolean: Boolean?, noinline statements: ()->Unit)
= NonReturningIfContinuation().ElseIfN(boolean,statements)
inline fun <reified T> retIfn(boolean: Boolean?, noinline statements: ()->T)
= ReturningIfContinuation<T>().ElseIfN(boolean,statements)
inline fun <reified T> retIfP(boolean: Boolean?, noinline statements: ()->T)
= ReturningIfContinuation<T>().ElseIfN(boolean,statements)
/**
* class for if-statement, which don't return anyhing.
* This is to not have to wory about the returtypes of the statements
*/
class NonReturningIfContinuation{
var caseReached: Boolean = false
//--------------- pass booleans directly to the function
fun ElseIf(condition: Boolean, statements: ()->Unit) = this.apply {
if (!caseReached && condition) {
statements()
caseReached = true
}
}
fun ElseIfP(condition: Boolean?, statements: ()->Unit)
= ElseIf(condition==true, statements)
fun ElseIfN(condition: Boolean?, statements: () -> Unit)
= ElseIf(condition==false, statements)
//---------------------------- pass booleans lazy
fun ElseIf(getBoolean: ()->Boolean, statements: () -> Unit) = this.apply {
if (!caseReached && getBoolean()) {
statements()
caseReached = true
}
}
fun ElseIfP(getBoolean: () -> Boolean?, statements: () -> Unit)
= ElseIf({getBoolean() == true}, statements)
fun ElseIfN(getBoolean: () -> Boolean?, statements: () -> Unit)
= ElseIf({getBoolean() == false}, statements)
//----------------------------get value
infix fun Else(statements: () -> Unit) { if (caseReached) statements() }
fun endIf() {} //not necesary, but used for matching ReturningIfContinuation
}
/**
* Class for if with returnvalue
* To be safe, this class makes no usage of casts.
* This meansthe returntype matches the type being inferred, or stated at the returntype
*/
class ReturningIfContinuation<T>(var retValue: T? = null){
var caseReached: Boolean = false
//----------------------------- pass boolean directly -------
fun ElseIf(boolean: Boolean, statements: ()->T) = this.apply {
if (!caseReached && boolean) {
retValue = statements()
caseReached = true
}
}
fun ElseIfP(boolean: Boolean?, statements: ()->T)
= ElseIf(boolean==true, statements)
fun ElseIfN(boolean: Boolean?, statements: () -> T)
= ElseIf(boolean==false, statements)
//--------------------------- pass booleans lazy ------------------
fun ElseIf(getBoolean: ()->Boolean, statements: () -> T) = this.apply {
if (!caseReached && getBoolean()){
retValue = statements()
caseReached = true
}
}
fun ElseIfP(getBoolean: ()->Boolean?, statements: () -> T)
= ElseIf({getBoolean() == true}, statements)
fun ElseIfN(getBoolean: ()->Boolean?, statements: () -> T)
= ElseIf({getBoolean() == false}, statements)
//--------------------- finishing------------------------
infix fun Else(statements: () -> T) = if (caseReached) retValue else statements()
fun endIf() : T? = if (caseReached) retValue else null
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment