Current intersection-type options in Kotlin

As a bonus, here’s TypeWrapper definitions up to 22 (playground alongside the previous asIntersection function, now without the numbers):


// Inspired by Arrow's Union classes definition
sealed class TypeWrapper22<out T1, out T2, out T3, out T4, out T5, out T6, out T7, out T8, out T9, out T10, out T11, out T12, out T13, out T14, out T15, out T16, out T17, out T18, out T19, out T20, out T21, out T22> {
    @PublishedApi internal object IMPL: TypeWrapper22<Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing>()
}
typealias TypeWrapper21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> = TypeWrapper22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, Nothing>
typealias TypeWrapper20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> = TypeWrapper21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, Nothing>
typealias TypeWrapper19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> = TypeWrapper20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, Nothing>
typealias TypeWrapper18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> = TypeWrapper19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, Nothing>
typealias TypeWrapper17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> = TypeWrapper18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, Nothing>
typealias TypeWrapper16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> = TypeWrapper17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, Nothing>
typealias TypeWrapper15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> = TypeWrapper16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, Nothing>
typealias TypeWrapper14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> = TypeWrapper15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, Nothing>
typealias TypeWrapper13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> = TypeWrapper14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Nothing>
typealias TypeWrapper12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> = TypeWrapper13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, Nothing>
typealias TypeWrapper11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> = TypeWrapper12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, Nothing>
typealias TypeWrapper10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> = TypeWrapper11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, Nothing>
typealias TypeWrapper9<T1, T2, T3, T4, T5, T6, T7, T8, T9> = TypeWrapper10<T1, T2, T3, T4, T5, T6, T7, T8, T9, Nothing>
typealias TypeWrapper8<T1, T2, T3, T4, T5, T6, T7, T8> = TypeWrapper9<T1, T2, T3, T4, T5, T6, T7, T8, Nothing>
typealias TypeWrapper7<T1, T2, T3, T4, T5, T6, T7> = TypeWrapper8<T1, T2, T3, T4, T5, T6, T7, Nothing>
typealias TypeWrapper6<T1, T2, T3, T4, T5, T6> = TypeWrapper7<T1, T2, T3, T4, T5, T6, Nothing>
typealias TypeWrapper5<T1, T2, T3, T4, T5> = TypeWrapper6<T1, T2, T3, T4, T5, Nothing>
typealias TypeWrapper4<T1, T2, T3, T4> = TypeWrapper5<T1, T2, T3, T4, Nothing>
typealias TypeWrapper3<T1, T2, T3> = TypeWrapper4<T1, T2, T3, Nothing>
typealias TypeWrapper2<T1, T2> = TypeWrapper3<T1, T2, Nothing>
typealias TypeWrapper1<T1> = TypeWrapper2<T1, Nothing>
    
// Type "constructors". The unitx parameters are there to avoid `Overload Resolution Ambiguity` errors
// due to the fact that all of the functions are named "type"
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit, unit16: Unit = Unit, unit17: Unit = Unit, unit18: Unit = Unit, unit19: Unit = Unit, unit20: Unit = Unit, unit21: Unit = Unit): TypeWrapper22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit, unit16: Unit = Unit, unit17: Unit = Unit, unit18: Unit = Unit, unit19: Unit = Unit, unit20: Unit = Unit): TypeWrapper21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit, unit16: Unit = Unit, unit17: Unit = Unit, unit18: Unit = Unit, unit19: Unit = Unit): TypeWrapper20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit, unit16: Unit = Unit, unit17: Unit = Unit, unit18: Unit = Unit): TypeWrapper19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit, unit16: Unit = Unit, unit17: Unit = Unit): TypeWrapper18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit, unit16: Unit = Unit): TypeWrapper17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit, unit15: Unit = Unit): TypeWrapper16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit, unit14: Unit = Unit): TypeWrapper15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit, unit13: Unit = Unit): TypeWrapper14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit, unit12: Unit = Unit): TypeWrapper13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit, unit11: Unit = Unit): TypeWrapper12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit, unit10: Unit = Unit): TypeWrapper11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit, unit9: Unit = Unit): TypeWrapper10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit, unit8: Unit = Unit): TypeWrapper9<T1, T2, T3, T4, T5, T6, T7, T8, T9>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7, T8> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit, unit7: Unit = Unit): TypeWrapper8<T1, T2, T3, T4, T5, T6, T7, T8>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6, T7> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit, unit6: Unit = Unit): TypeWrapper7<T1, T2, T3, T4, T5, T6, T7>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5, T6> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit, unit5: Unit = Unit): TypeWrapper6<T1, T2, T3, T4, T5, T6>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4, T5> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit, unit4: Unit = Unit): TypeWrapper5<T1, T2, T3, T4, T5>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3, T4> type(unit1: Unit = Unit, unit2: Unit = Unit, unit3: Unit = Unit): TypeWrapper4<T1, T2, T3, T4>
    = TypeWrapper22.IMPL
inline fun <T1, T2, T3> type(unit1: Unit = Unit, unit2: Unit = Unit): TypeWrapper3<T1, T2, T3>
    = TypeWrapper22.IMPL
inline fun <T1, T2> type(unit1: Unit = Unit): TypeWrapper2<T1, T2>
    = TypeWrapper22.IMPL
inline fun <T1> type(): TypeWrapper1<T1>
    = TypeWrapper22.IMPL

(before you ask, no I did not auto-generate this (copy/paste ftw), and yes this is a cry for help lol).
To be honest I couldn’t bring myself to create asIntersection functions up to 22, I did ones for 2 and 3 in the playground link, the rest is left as an exercise for the reader of course. Side note: I’m guessing that the playground wasn’t made to handle a lot of LOC because with this it just sometimes halts for a few seconds, possibly to contemplate its existence and my existence in addition.
I added all of the unitx parameters just because I hated seeing typex everywhere. However, I now won’t be able to stop seeing the word unit engraved in my eyes for the next who-knows-how-long!

You could probably make a library out of this, possibly named InterseKT (and yes I know I know FunKTionale did it first but whatever).

EDIT: I couldn’t help but do it. I auto-generated it this time though thankfully. Here you go (apparently it reaches the character limit allowed in discourse replies which is just hilarious tbh).

3 Likes