class I { } operator fun I.invoke(): E = E() operator fun I.invoke(x: Int): E = E() operator fun I.invoke(x: Int, y: Int): E = E() // operators over variables class A { } var a = A() val A.inc: I get() = I() fun useInc() { a++ } val A.dec: I get() = I() fun useDec() { a-- } val A.plusAssign: I get() = I() fun usePlusAssign() { a += 1 } val A.minusAssign: I get() = I() fun useMinusAssign() { a -= 1 } val A.timesAssign: I get() = I() fun useTimesAssign() { a *= 1 } val A.divAssign: I get() = I() fun useDivAssign() { a /= 1 } val A.remAssign: I get() = I() fun useRemAssign() { a %= 1 } // operators over values class E { } val e = E() val E.unaryPlus: I get() = I() val useUnaryPlus = +e val E.unaryMinus: I get() = I() val useUnaryMinus = -e val E.not: I get() = I() val useNot = !e val E.plus: I get() = I() val usePlus = e + 1 val E.minus: I get() = I() val useMinus = e - 1 val E.times: I get() = I() val useTimes = e * 1 val E.div: I get() = I() val useDiv = e / 1 val E.rem: I get() = I() val useRem = e % 1 val E.get: I get() = I() val useGet = e[1] val E.set: I get() = I() fun useSet() { e[1] = 3 } val E.contains: I get() = I() val useContains = 1 in e val useNotContains = 1 !in e val E.invoke: I get() = I() val useInvoke = e() val E.rangeTo: I get() = I() val useRangeTo = e .. 3 val E.rangeUntil: I get() = I() val useRangeUntil = e ..< 3 val E.compareTo: I get() = I() val useCompareTo = e > 2