Created
August 1, 2017 14:17
-
-
Save tieskedh/ff31d5609fc3d53af4b074017bf52709 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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