Skip to content

Instantly share code, notes, and snippets.

@zerosign
Last active April 27, 2020 06:18
Show Gist options
  • Select an option

  • Save zerosign/17b4404de9c3b049cf8c08fba7673960 to your computer and use it in GitHub Desktop.

Select an option

Save zerosign/17b4404de9c3b049cf8c08fba7673960 to your computer and use it in GitHub Desktop.
typesafe compile time manual dotty builder pattern example
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;
}
}
public final class builder {
public static void main(String[] var0) {
builder$.MODULE$.main(var0);
}
}
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()
}
}
public interface Count {
}
-- 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
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();
}
}
import scala.Enum;
public enum Marital implements Enum {
public int ordinal() {
return this.$ordinal();
}
}
public interface Once extends Count {
}
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));
}
}
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();
}
}
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));
}
}
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();
}
}
public interface Zero extends Count {
}
@zerosign
Copy link
Author

zerosign commented Apr 27, 2020

using constrained types for manually building typesafe builder in scala

  • the user API will never set a field more than once (or you could set whether it could be more than once or just once)
  • compile error if user forgot setting non optional field (controlled from PersonDetailBuilder#build type constraints)

@zerosign
Copy link
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