Last active
April 27, 2020 06:18
-
-
Save zerosign/17b4404de9c3b049cf8c08fba7673960 to your computer and use it in GitHub Desktop.
typesafe compile time manual dotty builder pattern example
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
| import java.io.Serializable; | |
| import java.time.LocalDate; | |
| import java.util.UUID; | |
| import scala..eq.colon.eq; | |
| import scala..less.colon.less.; | |
| import scala.runtime.BoxedUnit; | |
| import scala.runtime.BoxesRunTime; | |
| import scala.runtime.ModuleSerializationProxy; | |
| public final class builder$ implements Serializable { | |
| public static final builder$ MODULE$; | |
| static { | |
| new builder$(); | |
| } | |
| private builder$() { | |
| MODULE$ = this; | |
| } | |
| private Object writeReplace() { | |
| return new ModuleSerializationProxy(builder$.class); | |
| } | |
| public void main(String[] args) { | |
| UUID id = UUID.randomUUID(); | |
| eq evidence$1 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = new PersonDetailBuilder(PersonDetailBuilder$.MODULE$.$lessinit$greater$default$1(), PersonDetailBuilder$.MODULE$.$lessinit$greater$default$2(), PersonDetailBuilder$.MODULE$.$lessinit$greater$default$3(), PersonDetailBuilder$.MODULE$.$lessinit$greater$default$4(), PersonDetailBuilder$.MODULE$.$lessinit$greater$default$5(), PersonDetailBuilder$.MODULE$.$lessinit$greater$default$6(), PersonDetailBuilder$.MODULE$.$lessinit$greater$default$7()); | |
| eq evidence$2 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = PersonDetailBuilder_this.copy(scala.Some..MODULE$.apply(id), PersonDetailBuilder_this.copy$default$2(), PersonDetailBuilder_this.copy$default$3(), PersonDetailBuilder_this.copy$default$4(), PersonDetailBuilder_this.copy$default$5(), PersonDetailBuilder_this.copy$default$6(), PersonDetailBuilder_this.copy$default$7()); | |
| LocalDate birthDay = LocalDate.of(1991, 12, 10); | |
| eq evidence$3 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = PersonDetailBuilder_this.copy(PersonDetailBuilder_this.copy$default$1(), scala.Some..MODULE$.apply("Sample"), PersonDetailBuilder_this.copy$default$3(), PersonDetailBuilder_this.copy$default$4(), PersonDetailBuilder_this.copy$default$5(), PersonDetailBuilder_this.copy$default$6(), PersonDetailBuilder_this.copy$default$7()); | |
| eq evidence$4 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = PersonDetailBuilder_this.copy(PersonDetailBuilder_this.copy$default$1(), PersonDetailBuilder_this.copy$default$2(), scala.Some..MODULE$.apply(birthDay), PersonDetailBuilder_this.copy$default$4(), PersonDetailBuilder_this.copy$default$5(), PersonDetailBuilder_this.copy$default$6(), PersonDetailBuilder_this.copy$default$7()); | |
| eq evidence$5 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = PersonDetailBuilder_this.copy(PersonDetailBuilder_this.copy$default$1(), PersonDetailBuilder_this.copy$default$2(), PersonDetailBuilder_this.copy$default$3(), scala.Some..MODULE$.apply(Marital$.Married), PersonDetailBuilder_this.copy$default$5(), PersonDetailBuilder_this.copy$default$6(), PersonDetailBuilder_this.copy$default$7()); | |
| eq evidence$6 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = PersonDetailBuilder_this.copy(PersonDetailBuilder_this.copy$default$1(), PersonDetailBuilder_this.copy$default$2(), PersonDetailBuilder_this.copy$default$3(), PersonDetailBuilder_this.copy$default$4(), scala.Some..MODULE$.apply(BoxesRunTime.boxToInteger(1)), PersonDetailBuilder_this.copy$default$6(), PersonDetailBuilder_this.copy$default$7()); | |
| eq evidence$8 = .MODULE$.refl(); | |
| eq evidence$9 = .MODULE$.refl(); | |
| eq evidence$10 = .MODULE$.refl(); | |
| eq evidence$11 = .MODULE$.refl(); | |
| eq evidence$12 = .MODULE$.refl(); | |
| eq evidence$13 = .MODULE$.refl(); | |
| PersonDetailBuilder PersonDetailBuilder_this = PersonDetailBuilder_this.copy(PersonDetailBuilder_this.copy$default$1(), PersonDetailBuilder_this.copy$default$2(), PersonDetailBuilder_this.copy$default$3(), PersonDetailBuilder_this.copy$default$4(), PersonDetailBuilder_this.copy$default$5(), scala.Some..MODULE$.apply(""), PersonDetailBuilder_this.copy$default$7()); | |
| new PersonDetail((UUID)PersonDetailBuilder_this.id().get(), (String)PersonDetailBuilder_this.name().get(), (LocalDate)PersonDetailBuilder_this.birthDay().get(), (Marital)PersonDetailBuilder_this.marital().get(), BoxesRunTime.unboxToInt(PersonDetailBuilder_this.dependents().get()), (String)PersonDetailBuilder_this.address().get(), PersonDetailBuilder_this.desc()); | |
| BoxedUnit var10000 = BoxedUnit.UNIT; | |
| } | |
| } |
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
| public final class builder { | |
| public static void main(String[] var0) { | |
| builder$.MODULE$.main(var0); | |
| } | |
| } |
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
| import java.time.{ Period, LocalDate } | |
| import java.util.UUID | |
| sealed trait Count | |
| sealed trait Zero extends Count | |
| sealed trait Once extends Count | |
| enum Marital { | |
| case Single, Married, Divorced | |
| } | |
| case class PersonDetail( | |
| id: UUID, | |
| name: String, | |
| birthDay: LocalDate, | |
| marital: Marital, | |
| dependents: Int, | |
| address: String, | |
| desc: Option[String], | |
| ) { | |
| inline def age() : Period = birthDay.until(LocalDate.now()) | |
| } | |
| object PersonDetailBuilder { | |
| inline def apply() = | |
| new PersonDetailBuilder[Zero, Zero, Zero, Zero, Zero, Zero, Zero]() | |
| } | |
| case class PersonDetailBuilder[ | |
| WithId <: Count, WithName <: Count, WithBirthDay <: Count, | |
| WithMarital <: Count, WithDependents <: Count, WithAddress <: Count, | |
| WithDesc <: Count | |
| ]( | |
| id: Option[UUID] = None, | |
| name: Option[String] = None, | |
| birthDay: Option[LocalDate] = None, | |
| marital: Option[Marital] = None, | |
| dependents: Option[Int] = None, | |
| address: Option[String] = None, | |
| desc: Option[String] = None | |
| ) { | |
| type IsOnce[T] = =:=[T, Once] | |
| type IsZero[T] = =:=[T, Zero] | |
| inline def withId[I <: WithId : IsZero](id: UUID) = | |
| copy[Once, WithName, WithBirthDay, WithMarital, WithDependents, WithAddress, WithDesc](id = Some(id)) | |
| inline def withName[N <: WithName : IsZero](name: String) = | |
| copy[WithId, Once, WithBirthDay, WithMarital, WithDependents, WithAddress, WithDesc](name = Some(name)) | |
| inline def withBirthDay[BD <: WithBirthDay : IsZero](birthDay: LocalDate) = | |
| copy[WithId, WithName, Once, WithMarital, WithDependents, WithAddress, WithDesc](birthDay = Some(birthDay)) | |
| inline def withMarital[M <: WithMarital : IsZero](marital: Marital) = | |
| copy[WithId, WithName, WithBirthDay, Once, WithDependents, WithAddress, WithDesc](marital = Some(marital)) | |
| inline def withDependents[D <: WithDependents : IsZero](dependents: Int) = | |
| copy[WithId, WithName, WithBirthDay, WithMarital, Once, WithAddress, WithDesc](dependents = Some(dependents)) | |
| inline def withAddress[A <: WithAddress: IsZero](address: String) = | |
| copy[WithId, WithName, WithBirthDay, WithMarital, WithDependents, Once, WithDesc](address = Some(address)) | |
| inline def withDesc[DE <: WithDesc : IsZero](desc: String) = | |
| copy[WithId, WithName, WithBirthDay, WithMarital, WithDependents, WithAddress, Once](desc = Some(desc)) | |
| inline def build[ | |
| B <: WithId : IsOnce, N <: WithName : IsOnce, BD <: WithBirthDay : IsOnce, | |
| M <: WithMarital : IsOnce, D <: WithDependents : IsOnce, A <: WithAddress : IsOnce | |
| ]() = | |
| new PersonDetail( | |
| id.get, name.get, birthDay.get, | |
| marital.get, dependents.get, | |
| address.get, desc | |
| ) | |
| } | |
| object builder { | |
| // this compile | |
| inline def testCompile() : Unit = { | |
| val detail = PersonDetailBuilder.apply() | |
| .withId(UUID.randomUUID()) | |
| .withName("Sample") | |
| .withBirthDay(LocalDate.of(1991, 12, 10)) | |
| .withMarital(Marital.Married) | |
| .withDependents(1) | |
| .withAddress("") | |
| .build() | |
| } | |
| // this should not compile | |
| // def testDidntCompile() : Unit = { | |
| // val detail = PersonDetailBuilder.apply() | |
| // .withId(UUID.randomUUID()) | |
| // .withName("Sample") | |
| // .withBirthDay(LocalDate.of(1991, 12, 10)) | |
| // .build() | |
| // } | |
| def main(args: Array[String]) : Unit = { | |
| testCompile() | |
| // testDidntCompile() | |
| } | |
| } |
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
| public interface Count { | |
| } |
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
| -- Error: builder.scala:92:14 -------------------------------------------------- | |
| 92 | .build() | |
| | ^ | |
| | Cannot prove that M | |
| | | |
| | where: M is a type variable with constraint <: Zero | |
| | =:= Once.. | |
| | I found: | |
| | | |
| | <:<.refl[Nothing] | |
| | | |
| | But method refl in object <:< does not match type M =:= Once. | |
| 1 error found |
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
| import java.io.Serializable; | |
| import java.util.NoSuchElementException; | |
| import scala.deriving.Mirror.Singleton; | |
| import scala.deriving.Mirror.Sum; | |
| import scala.reflect.ClassTag.; | |
| import scala.runtime.EnumValues; | |
| import scala.runtime.ModuleSerializationProxy; | |
| public final class Marital$ implements Serializable, Sum { | |
| public static final Marital$ MODULE$; | |
| public final EnumValues Marital$$$$values; | |
| Single, | |
| Married, | |
| Divorced; | |
| static { | |
| new Marital$(); | |
| } | |
| private Marital$() { | |
| MODULE$ = this; | |
| this.Marital$$$$values = new EnumValues(); | |
| Single = this.$new(0, "Single"); | |
| Married = this.$new(1, "Married"); | |
| Divorced = this.$new(2, "Divorced"); | |
| } | |
| private Object writeReplace() { | |
| return new ModuleSerializationProxy(Marital$.class); | |
| } | |
| public Marital[] values() { | |
| return (Marital[])this.Marital$$$$values.values().toArray(.MODULE$.apply(Marital.class)); | |
| } | |
| public Marital valueOf(String $name) { | |
| try { | |
| return (Marital)this.Marital$$$$values.fromName().apply($name); | |
| } catch (NoSuchElementException var3) { | |
| throw new IllegalArgumentException("key not found: ".concat($name)); | |
| } | |
| } | |
| private Marital $new(int _$ordinal, String $name) { | |
| return new Singleton(_$ordinal, $name) { | |
| private final int _$ordinal$1; | |
| private final String $name$1; | |
| public { | |
| this._$ordinal$1 = _$ordinal$2; | |
| this.$name$1 = $name$2; | |
| Marital$.MODULE$.Marital$$$$values.register(this); | |
| } | |
| public int $ordinal() { | |
| return this._$ordinal$1; | |
| } | |
| public String toString() { | |
| return this.$name$1; | |
| } | |
| }; | |
| } | |
| public int ordinal(Marital x$0) { | |
| return x$0.ordinal(); | |
| } | |
| } |
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
| import scala.Enum; | |
| public enum Marital implements Enum { | |
| public int ordinal() { | |
| return this.$ordinal(); | |
| } | |
| } |
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
| public interface Once extends Count { | |
| } |
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
| import java.io.Serializable; | |
| import java.time.LocalDate; | |
| import java.util.UUID; | |
| import scala.Function7; | |
| import scala.Option; | |
| import scala.deriving.Mirror.Product; | |
| import scala.runtime.BoxesRunTime; | |
| import scala.runtime.ModuleSerializationProxy; | |
| public final class PersonDetail$ implements Function7, Serializable, Product { | |
| public static final PersonDetail$ MODULE$; | |
| static { | |
| new PersonDetail$(); | |
| } | |
| private PersonDetail$() { | |
| MODULE$ = this; | |
| } | |
| private Object writeReplace() { | |
| return new ModuleSerializationProxy(PersonDetail$.class); | |
| } | |
| public PersonDetail apply(UUID id, String name, LocalDate birthDay, Marital marital, int dependents, String address, Option desc) { | |
| return new PersonDetail(id, name, birthDay, marital, dependents, address, desc); | |
| } | |
| public PersonDetail unapply(PersonDetail x$1) { | |
| return x$1; | |
| } | |
| public PersonDetail fromProduct(scala.Product x$0) { | |
| return new PersonDetail((UUID)x$0.productElement(0), (String)x$0.productElement(1), (LocalDate)x$0.productElement(2), (Marital)x$0.productElement(3), BoxesRunTime.unboxToInt((Object)x$0.productElement(4)), (String)x$0.productElement(5), (Option)x$0.productElement(6)); | |
| } | |
| } |
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
| import java.io.Serializable; | |
| import java.time.LocalDate; | |
| import java.util.UUID; | |
| import scala.Function1; | |
| import scala.Option; | |
| import scala.Product; | |
| import scala.runtime.BoxesRunTime; | |
| import scala.runtime.Statics; | |
| import scala.runtime.ScalaRunTime.; | |
| public class PersonDetail implements Product, Serializable { | |
| private final UUID id; | |
| private final String name; | |
| private final LocalDate birthDay; | |
| private final Marital marital; | |
| private final int dependents; | |
| private final String address; | |
| private final Option desc; | |
| public static PersonDetail apply(UUID var0, String var1, LocalDate var2, Marital var3, int var4, String var5, Option var6) { | |
| return PersonDetail$.MODULE$.apply(var0, var1, var2, var3, var4, var5, var6); | |
| } | |
| public static Function1 curried() { | |
| return PersonDetail$.MODULE$.curried(); | |
| } | |
| public static PersonDetail fromProduct(Product var0) { | |
| return PersonDetail$.MODULE$.fromProduct(var0); | |
| } | |
| public static Function1 tupled() { | |
| return PersonDetail$.MODULE$.tupled(); | |
| } | |
| public static PersonDetail unapply(PersonDetail var0) { | |
| return PersonDetail$.MODULE$.unapply(var0); | |
| } | |
| public PersonDetail(UUID id, String name, LocalDate birthDay, Marital marital, int dependents, String address, Option desc) { | |
| this.id = id; | |
| this.name = name; | |
| this.birthDay = birthDay; | |
| this.marital = marital; | |
| this.dependents = dependents; | |
| this.address = address; | |
| this.desc = desc; | |
| } | |
| public int hashCode() { | |
| int var1 = -889275714; | |
| var1 = Statics.mix(var1, this.productPrefix().hashCode()); | |
| var1 = Statics.mix(var1, Statics.anyHash(this.id())); | |
| var1 = Statics.mix(var1, Statics.anyHash(this.name())); | |
| var1 = Statics.mix(var1, Statics.anyHash(this.birthDay())); | |
| var1 = Statics.mix(var1, Statics.anyHash(this.marital())); | |
| var1 = Statics.mix(var1, this.dependents()); | |
| var1 = Statics.mix(var1, Statics.anyHash(this.address())); | |
| var1 = Statics.mix(var1, Statics.anyHash(this.desc())); | |
| return Statics.finalizeHash(var1, 7); | |
| } | |
| public boolean equals(Object x$0) { | |
| boolean var14; | |
| if (this != (Object)x$0) { | |
| if (!(x$0 instanceof PersonDetail)) { | |
| var14 = false; | |
| } else { | |
| label80: { | |
| label83: { | |
| PersonDetail var3 = (PersonDetail)x$0; | |
| if (this.dependents() == var3.dependents()) { | |
| label81: { | |
| UUID var10000 = this.id(); | |
| UUID var4 = var3.id(); | |
| if (var10000 == null) { | |
| if (var4 != null) { | |
| break label81; | |
| } | |
| } else if (!var10000.equals(var4)) { | |
| break label81; | |
| } | |
| String var10 = this.name(); | |
| String var5 = var3.name(); | |
| if (var10 == null) { | |
| if (var5 != null) { | |
| break label81; | |
| } | |
| } else if (!var10.equals(var5)) { | |
| break label81; | |
| } | |
| LocalDate var11 = this.birthDay(); | |
| LocalDate var6 = var3.birthDay(); | |
| if (var11 == null) { | |
| if (var6 != null) { | |
| break label81; | |
| } | |
| } else if (!var11.equals(var6)) { | |
| break label81; | |
| } | |
| Marital var12 = this.marital(); | |
| Marital var7 = var3.marital(); | |
| if (var12 == null) { | |
| if (var7 != null) { | |
| break label81; | |
| } | |
| } else if (!var12.equals(var7)) { | |
| break label81; | |
| } | |
| var10 = this.address(); | |
| String var8 = var3.address(); | |
| if (var10 == null) { | |
| if (var8 != null) { | |
| break label81; | |
| } | |
| } else if (!var10.equals(var8)) { | |
| break label81; | |
| } | |
| Option var13 = this.desc(); | |
| Option var9 = var3.desc(); | |
| if (var13 == null) { | |
| if (var9 == null) { | |
| break label83; | |
| } | |
| } else if (var13.equals(var9)) { | |
| break label83; | |
| } | |
| } | |
| } | |
| var14 = false; | |
| break label80; | |
| } | |
| var14 = true; | |
| } | |
| } | |
| if (!var14) { | |
| var14 = false; | |
| return var14; | |
| } | |
| } | |
| var14 = true; | |
| return var14; | |
| } | |
| public String toString() { | |
| return .MODULE$._toString(this); | |
| } | |
| public boolean canEqual(Object that) { | |
| return that instanceof PersonDetail; | |
| } | |
| public int productArity() { | |
| return 7; | |
| } | |
| public String productPrefix() { | |
| return "PersonDetail"; | |
| } | |
| public Object productElement(int n) { | |
| Object var10000; | |
| switch(n) { | |
| case 0: | |
| var10000 = this._1(); | |
| break; | |
| case 1: | |
| var10000 = this._2(); | |
| break; | |
| case 2: | |
| var10000 = this._3(); | |
| break; | |
| case 3: | |
| var10000 = this._4(); | |
| break; | |
| case 4: | |
| var10000 = BoxesRunTime.boxToInteger(this._5()); | |
| break; | |
| case 5: | |
| var10000 = this._6(); | |
| break; | |
| case 6: | |
| var10000 = this._7(); | |
| break; | |
| default: | |
| throw new IndexOutOfBoundsException(BoxesRunTime.boxToInteger(n).toString()); | |
| } | |
| return var10000; | |
| } | |
| public String productElementName(int n) { | |
| String var10000; | |
| switch(n) { | |
| case 0: | |
| var10000 = "id"; | |
| break; | |
| case 1: | |
| var10000 = "name"; | |
| break; | |
| case 2: | |
| var10000 = "birthDay"; | |
| break; | |
| case 3: | |
| var10000 = "marital"; | |
| break; | |
| case 4: | |
| var10000 = "dependents"; | |
| break; | |
| case 5: | |
| var10000 = "address"; | |
| break; | |
| case 6: | |
| var10000 = "desc"; | |
| break; | |
| default: | |
| throw new IndexOutOfBoundsException(BoxesRunTime.boxToInteger(n).toString()); | |
| } | |
| return var10000; | |
| } | |
| public UUID id() { | |
| return this.id; | |
| } | |
| public String name() { | |
| return this.name; | |
| } | |
| public LocalDate birthDay() { | |
| return this.birthDay; | |
| } | |
| public Marital marital() { | |
| return this.marital; | |
| } | |
| public int dependents() { | |
| return this.dependents; | |
| } | |
| public String address() { | |
| return this.address; | |
| } | |
| public Option desc() { | |
| return this.desc; | |
| } | |
| public PersonDetail copy(UUID id, String name, LocalDate birthDay, Marital marital, int dependents, String address, Option desc) { | |
| return new PersonDetail(id, name, birthDay, marital, dependents, address, desc); | |
| } | |
| public UUID copy$default$1() { | |
| return this.id(); | |
| } | |
| public String copy$default$2() { | |
| return this.name(); | |
| } | |
| public LocalDate copy$default$3() { | |
| return this.birthDay(); | |
| } | |
| public Marital copy$default$4() { | |
| return this.marital(); | |
| } | |
| public int copy$default$5() { | |
| return this.dependents(); | |
| } | |
| public String copy$default$6() { | |
| return this.address(); | |
| } | |
| public Option copy$default$7() { | |
| return this.desc(); | |
| } | |
| public UUID _1() { | |
| return this.id(); | |
| } | |
| public String _2() { | |
| return this.name(); | |
| } | |
| public LocalDate _3() { | |
| return this.birthDay(); | |
| } | |
| public Marital _4() { | |
| return this.marital(); | |
| } | |
| public int _5() { | |
| return this.dependents(); | |
| } | |
| public String _6() { | |
| return this.address(); | |
| } | |
| public Option _7() { | |
| return this.desc(); | |
| } | |
| } |
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
| import java.io.Serializable; | |
| import scala.Option; | |
| import scala.None.; | |
| import scala.deriving.Mirror.Product; | |
| import scala.runtime.ModuleSerializationProxy; | |
| public final class PersonDetailBuilder$ implements Serializable, Product { | |
| public static final PersonDetailBuilder$ MODULE$; | |
| static { | |
| new PersonDetailBuilder$(); | |
| } | |
| private PersonDetailBuilder$() { | |
| MODULE$ = this; | |
| } | |
| private Object writeReplace() { | |
| return new ModuleSerializationProxy(PersonDetailBuilder$.class); | |
| } | |
| public PersonDetailBuilder apply(Option id, Option name, Option birthDay, Option marital, Option dependents, Option address, Option desc) { | |
| return new PersonDetailBuilder(id, name, birthDay, marital, dependents, address, desc); | |
| } | |
| public PersonDetailBuilder unapply(PersonDetailBuilder x$1) { | |
| return x$1; | |
| } | |
| public $lessinit$greater$default$1() { | |
| return .MODULE$; | |
| } | |
| public $lessinit$greater$default$2() { | |
| return .MODULE$; | |
| } | |
| public $lessinit$greater$default$3() { | |
| return .MODULE$; | |
| } | |
| public $lessinit$greater$default$4() { | |
| return .MODULE$; | |
| } | |
| public $lessinit$greater$default$5() { | |
| return .MODULE$; | |
| } | |
| public $lessinit$greater$default$6() { | |
| return .MODULE$; | |
| } | |
| public $lessinit$greater$default$7() { | |
| return .MODULE$; | |
| } | |
| public PersonDetailBuilder fromProduct(scala.Product x$0) { | |
| return new PersonDetailBuilder((Option)x$0.productElement(0), (Option)x$0.productElement(1), (Option)x$0.productElement(2), (Option)x$0.productElement(3), (Option)x$0.productElement(4), (Option)x$0.productElement(5), (Option)x$0.productElement(6)); | |
| } | |
| } |
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
| import java.io.Serializable; | |
| import scala.Option; | |
| import scala.Product; | |
| import scala.None.; | |
| import scala.runtime.BoxesRunTime; | |
| public class PersonDetailBuilder implements Product, Serializable { | |
| private final Option id; | |
| private final Option name; | |
| private final Option birthDay; | |
| private final Option marital; | |
| private final Option dependents; | |
| private final Option address; | |
| private final Option desc; | |
| public static PersonDetailBuilder apply(Option var0, Option var1, Option var2, Option var3, Option var4, Option var5, Option var6) { | |
| return PersonDetailBuilder$.MODULE$.apply(var0, var1, var2, var3, var4, var5, var6); | |
| } | |
| public static PersonDetailBuilder fromProduct(Product var0) { | |
| return PersonDetailBuilder$.MODULE$.fromProduct(var0); | |
| } | |
| public static PersonDetailBuilder unapply(PersonDetailBuilder var0) { | |
| return PersonDetailBuilder$.MODULE$.unapply(var0); | |
| } | |
| public static $lessinit$greater$default$1() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$1(); | |
| } | |
| public static $lessinit$greater$default$2() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$2(); | |
| } | |
| public static $lessinit$greater$default$3() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$3(); | |
| } | |
| public static $lessinit$greater$default$4() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$4(); | |
| } | |
| public static $lessinit$greater$default$5() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$5(); | |
| } | |
| public static $lessinit$greater$default$6() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$6(); | |
| } | |
| public static $lessinit$greater$default$7() { | |
| return PersonDetailBuilder$.MODULE$.$lessinit$greater$default$7(); | |
| } | |
| public PersonDetailBuilder(Option id, Option name, Option birthDay, Option marital, Option dependents, Option address, Option desc) { | |
| this.id = id; | |
| this.name = name; | |
| this.birthDay = birthDay; | |
| this.marital = marital; | |
| this.dependents = dependents; | |
| this.address = address; | |
| this.desc = desc; | |
| } | |
| public int hashCode() { | |
| return scala.runtime.ScalaRunTime..MODULE$._hashCode(this); | |
| } | |
| public boolean equals(Object x$0) { | |
| boolean var11; | |
| if (this != (Object)x$0) { | |
| if (!(x$0 instanceof PersonDetailBuilder)) { | |
| var11 = false; | |
| } else { | |
| label84: { | |
| label83: { | |
| PersonDetailBuilder var3 = (PersonDetailBuilder)x$0; | |
| Option var10000 = this.id(); | |
| Option var4 = var3.id(); | |
| if (var10000 == null) { | |
| if (var4 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var4)) { | |
| break label83; | |
| } | |
| var10000 = this.name(); | |
| Option var5 = var3.name(); | |
| if (var10000 == null) { | |
| if (var5 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var5)) { | |
| break label83; | |
| } | |
| var10000 = this.birthDay(); | |
| Option var6 = var3.birthDay(); | |
| if (var10000 == null) { | |
| if (var6 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var6)) { | |
| break label83; | |
| } | |
| var10000 = this.marital(); | |
| Option var7 = var3.marital(); | |
| if (var10000 == null) { | |
| if (var7 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var7)) { | |
| break label83; | |
| } | |
| var10000 = this.dependents(); | |
| Option var8 = var3.dependents(); | |
| if (var10000 == null) { | |
| if (var8 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var8)) { | |
| break label83; | |
| } | |
| var10000 = this.address(); | |
| Option var9 = var3.address(); | |
| if (var10000 == null) { | |
| if (var9 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var9)) { | |
| break label83; | |
| } | |
| var10000 = this.desc(); | |
| Option var10 = var3.desc(); | |
| if (var10000 == null) { | |
| if (var10 != null) { | |
| break label83; | |
| } | |
| } else if (!var10000.equals(var10)) { | |
| break label83; | |
| } | |
| var11 = true; | |
| break label84; | |
| } | |
| var11 = false; | |
| } | |
| } | |
| if (!var11) { | |
| var11 = false; | |
| return var11; | |
| } | |
| } | |
| var11 = true; | |
| return var11; | |
| } | |
| public String toString() { | |
| return scala.runtime.ScalaRunTime..MODULE$._toString(this); | |
| } | |
| public boolean canEqual(Object that) { | |
| return that instanceof PersonDetailBuilder; | |
| } | |
| public int productArity() { | |
| return 7; | |
| } | |
| public String productPrefix() { | |
| return "PersonDetailBuilder"; | |
| } | |
| public Object productElement(int n) { | |
| Option var10000; | |
| switch(n) { | |
| case 0: | |
| var10000 = this._1(); | |
| break; | |
| case 1: | |
| var10000 = this._2(); | |
| break; | |
| case 2: | |
| var10000 = this._3(); | |
| break; | |
| case 3: | |
| var10000 = this._4(); | |
| break; | |
| case 4: | |
| var10000 = this._5(); | |
| break; | |
| case 5: | |
| var10000 = this._6(); | |
| break; | |
| case 6: | |
| var10000 = this._7(); | |
| break; | |
| default: | |
| throw new IndexOutOfBoundsException(BoxesRunTime.boxToInteger(n).toString()); | |
| } | |
| return var10000; | |
| } | |
| public String productElementName(int n) { | |
| String var10000; | |
| switch(n) { | |
| case 0: | |
| var10000 = "id"; | |
| break; | |
| case 1: | |
| var10000 = "name"; | |
| break; | |
| case 2: | |
| var10000 = "birthDay"; | |
| break; | |
| case 3: | |
| var10000 = "marital"; | |
| break; | |
| case 4: | |
| var10000 = "dependents"; | |
| break; | |
| case 5: | |
| var10000 = "address"; | |
| break; | |
| case 6: | |
| var10000 = "desc"; | |
| break; | |
| default: | |
| throw new IndexOutOfBoundsException(BoxesRunTime.boxToInteger(n).toString()); | |
| } | |
| return var10000; | |
| } | |
| public Option id() { | |
| return this.id; | |
| } | |
| public Option name() { | |
| return this.name; | |
| } | |
| public Option birthDay() { | |
| return this.birthDay; | |
| } | |
| public Option marital() { | |
| return this.marital; | |
| } | |
| public Option dependents() { | |
| return this.dependents; | |
| } | |
| public Option address() { | |
| return this.address; | |
| } | |
| public Option desc() { | |
| return this.desc; | |
| } | |
| public PersonDetailBuilder copy(Option id, Option name, Option birthDay, Option marital, Option dependents, Option address, Option desc) { | |
| return new PersonDetailBuilder(id, name, birthDay, marital, dependents, address, desc); | |
| } | |
| public Option copy$default$1() { | |
| return this.id(); | |
| } | |
| public Option copy$default$2() { | |
| return this.name(); | |
| } | |
| public Option copy$default$3() { | |
| return this.birthDay(); | |
| } | |
| public Option copy$default$4() { | |
| return this.marital(); | |
| } | |
| public Option copy$default$5() { | |
| return this.dependents(); | |
| } | |
| public Option copy$default$6() { | |
| return this.address(); | |
| } | |
| public Option copy$default$7() { | |
| return this.desc(); | |
| } | |
| public Option _1() { | |
| return this.id(); | |
| } | |
| public Option _2() { | |
| return this.name(); | |
| } | |
| public Option _3() { | |
| return this.birthDay(); | |
| } | |
| public Option _4() { | |
| return this.marital(); | |
| } | |
| public Option _5() { | |
| return this.dependents(); | |
| } | |
| public Option _6() { | |
| return this.address(); | |
| } | |
| public Option _7() { | |
| return this.desc(); | |
| } | |
| } |
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
| public interface Zero extends Count { | |
| } |
Author
Author
Note: all *.java are decompiled using fernflower, while actual scala files in builder.scala
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
using constrained types for manually building typesafe builder in scala