How to create generated objects in shapeless
up vote
0
down vote
favorite
Suppose I have a normalized database model for a generic type that comes in like this:
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Given a sequence of BaseModel
, if all the fields of a certain Option
attribute are not populated, can shapeless create a reduced model for me?
For example suppose that all the attr1
fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
scala generic-programming shapeless
add a comment |
up vote
0
down vote
favorite
Suppose I have a normalized database model for a generic type that comes in like this:
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Given a sequence of BaseModel
, if all the fields of a certain Option
attribute are not populated, can shapeless create a reduced model for me?
For example suppose that all the attr1
fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
scala generic-programming shapeless
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
Suppose I have a normalized database model for a generic type that comes in like this:
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Given a sequence of BaseModel
, if all the fields of a certain Option
attribute are not populated, can shapeless create a reduced model for me?
For example suppose that all the attr1
fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
scala generic-programming shapeless
Suppose I have a normalized database model for a generic type that comes in like this:
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
Given a sequence of BaseModel
, if all the fields of a certain Option
attribute are not populated, can shapeless create a reduced model for me?
For example suppose that all the attr1
fields are empty. Without me having to specify the object before hand can shapeless create a generic object that looks like this?
case class BaseModel(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
scala generic-programming shapeless
scala generic-programming shapeless
asked Nov 2 at 15:21
franklin
81842447
81842447
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
What Shapeless can do is, given two case classes, create an object of one of them from an object of another.
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.
1
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
No. I think it does. AChildModel1
with typesa, b, c, d
and aChildModel2
with typesa, b, c, d, e
must both extend aBaseModel
with typesa, b, c, d, e
. TheBaseModel
must contain the product of all the types used in any child model.
– franklin
Nov 6 at 18:08
1
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
|
show 1 more comment
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
What Shapeless can do is, given two case classes, create an object of one of them from an object of another.
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.
1
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
No. I think it does. AChildModel1
with typesa, b, c, d
and aChildModel2
with typesa, b, c, d, e
must both extend aBaseModel
with typesa, b, c, d, e
. TheBaseModel
must contain the product of all the types used in any child model.
– franklin
Nov 6 at 18:08
1
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
|
show 1 more comment
up vote
1
down vote
accepted
What Shapeless can do is, given two case classes, create an object of one of them from an object of another.
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.
1
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
No. I think it does. AChildModel1
with typesa, b, c, d
and aChildModel2
with typesa, b, c, d, e
must both extend aBaseModel
with typesa, b, c, d, e
. TheBaseModel
must contain the product of all the types used in any child model.
– franklin
Nov 6 at 18:08
1
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
|
show 1 more comment
up vote
1
down vote
accepted
up vote
1
down vote
accepted
What Shapeless can do is, given two case classes, create an object of one of them from an object of another.
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.
What Shapeless can do is, given two case classes, create an object of one of them from an object of another.
import java.time.LocalDate
import shapeless.LabelledGeneric
import shapeless.record._
case class BaseModel(id: String,
createdBy: String,
attr1: Option[String] = None,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
case class BaseModel1(id: String,
createdBy: String,
attr2: Option[Int] = None,
attr3: Option[LocalDate] = None)
val bm = BaseModel(
id = "cff4545gvgf",
createdBy = "John Doe",
attr2 = Some(42),
attr3 = Some(LocalDate.parse("2018-11-03"))
) // BaseModel(cff4545gvgf,John Doe,None,Some(42),Some(2018-11-03))
val hlist = LabelledGeneric[BaseModel].to(bm)
val hlist1 = hlist - 'attr1
val bm1 = LabelledGeneric[BaseModel1].from(hlist1)
// BaseModel1(cff4545gvgf,John Doe,Some(42),Some(2018-11-03))
But Shapeless can't create a new case class. If you need a new case class to be created automatically you can write a macro.
edited Nov 11 at 22:38
franklin
81842447
81842447
answered Nov 3 at 8:34
Dmytro Mitin
6,146515
6,146515
1
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
No. I think it does. AChildModel1
with typesa, b, c, d
and aChildModel2
with typesa, b, c, d, e
must both extend aBaseModel
with typesa, b, c, d, e
. TheBaseModel
must contain the product of all the types used in any child model.
– franklin
Nov 6 at 18:08
1
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
|
show 1 more comment
1
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
No. I think it does. AChildModel1
with typesa, b, c, d
and aChildModel2
with typesa, b, c, d, e
must both extend aBaseModel
with typesa, b, c, d, e
. TheBaseModel
must contain the product of all the types used in any child model.
– franklin
Nov 6 at 18:08
1
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
1
1
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
stackoverflow.com/questions/22850340/… Maybe this?
– franklin
Nov 3 at 15:10
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Does this mean that for generics, the Base Model needs to have all the fields of any possible Child Model?
– franklin
Nov 6 at 14:26
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
Sorry I don't understand your question. I guess it doesn't.
– Dmytro Mitin
Nov 6 at 14:34
No. I think it does. A
ChildModel1
with types a, b, c, d
and a ChildModel2
with types a, b, c, d, e
must both extend a BaseModel
with types a, b, c, d, e
. The BaseModel
must contain the product of all the types used in any child model.– franklin
Nov 6 at 18:08
No. I think it does. A
ChildModel1
with types a, b, c, d
and a ChildModel2
with types a, b, c, d, e
must both extend a BaseModel
with types a, b, c, d, e
. The BaseModel
must contain the product of all the types used in any child model.– franklin
Nov 6 at 18:08
1
1
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
What Shapeless does, is tranformation from case class to some generic representation (hlist) and vice versa. You can do everything what you want with hlist, add fields, remove fields, transform fields. What Shapeless can't do is defining case classes.
– Dmytro Mitin
Nov 6 at 19:22
|
show 1 more comment
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53121345%2fhow-to-create-generated-objects-in-shapeless%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown