bijection-clojure/codegen/Generator.scala (34 lines of code) (raw):

// Run this generator like a script: // scala Generator.scala > ../src/main/scala-2.12-/com/twitter/bijection/clojure/GeneratedIFnBijections.scala /* * Example of the code generated: implicit def function0ToIFn[A]: Bijection[Function0[A], IFn] = new AbstractBijection[Function0[A], IFn] { def apply(fn: Function0[A]) = new AFn { override def invoke: AnyRef = fn.apply.asInstanceOf[AnyRef] } override def invert(fn: IFn) = { () => fn.invoke.asInstanceOf[A] } } */ val lowerLetters = ('a' to 'z').map { _.toString }.toIndexedSeq val upperLetters = ('A' to 'Z').map { _.toString }.toIndexedSeq def castParam(i: Int): String = "%s.asInstanceOf[%s]".format(lowerLetters(i), upperLetters(i)) def typeParam(i: Int): String = "%s: %s".format(lowerLetters(i), upperLetters(i)) def genParams(count: Int)(fn: Int => String): String = (0 until count).map { fn(_) }.mkString(",") // Here we put it all together: def implicitIFn(i: Int): String = { val func = "function" + i val types = genParams(i + 1) { upperLetters(_) } val funcType = "%s[%s]".format(func.capitalize, types) val bijectionType = "Bijection[%s, IFn]".format(funcType) """ implicit def %sToIFn[%s]: %s = new Abstract%s { def apply(fn: %s) = new AFn { override def invoke(%s): AnyRef = fn.apply(%s).asInstanceOf[AnyRef] } override def invert(fn: IFn) = { (%s) => fn.invoke(%s).asInstanceOf[%s] } }""".format(func, types, bijectionType, bijectionType, funcType, genParams(i) { "%s: AnyRef" format lowerLetters(_) }, genParams(i)(castParam), genParams(i){ lowerLetters(_) }, genParams(i){ lowerLetters(_) }, upperLetters(i)) } println("// Autogenerated code DO NOT EDIT BY HAND") println("// Generated by bijection-clojure/codegen/Generator.scala") println("package com.twitter.bijection.clojure") println("import clojure.lang.{ AFn, IFn }") println("import com.twitter.bijection.{ AbstractBijection, Bijection, CastInjection }") println("\ntrait GeneratedIFnBijections {") (0 to 20).map { implicitIFn(_) }.foreach { println(_) } println("}")