-
Notifications
You must be signed in to change notification settings - Fork 146
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Many to one #175
Many to one #175
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The compilation failure is real; but otherwise looks ok to me :)
@@ -227,6 +227,19 @@ object UncapitalisedEnum extends Enum[UncapitalisedEnum] { | |||
|
|||
} | |||
|
|||
case object MultiEnum extends Enum[MultiEnum] { | |||
import scala.collection.breakOut | |||
val values = findValues |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can't do this because the type parameter passed to Enum
must be a sealed trait.
Compilation error https://travis-ci.org/lloydmeta/enumeratum/jobs/343456716#L844
[error] /home/travis/build/lloydmeta/enumeratum/enumeratum-core/src/test/scala/enumeratum/Models.scala:232:16: You can only use findValues on sealed traits or classes
[error] val values = findValues
[error] ^
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed.
@@ -167,6 +175,9 @@ object EnumEntry { | |||
*/ | |||
trait LowerCamelcase extends EnumEntry with Camelcase with Uncapitalised | |||
|
|||
abstract class MultiEnum(override val entryName: String, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is needed (at least not here); looks like something you want in your tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed.
@@ -31,8 +31,8 @@ object EnumEntry { | |||
* | |||
* http://stackoverflow.com/a/19832063/1814775 | |||
*/ | |||
private val regexp1: Pattern = Pattern.compile("([A-Z]+)([A-Z][a-z])") | |||
private val regexp2: Pattern = Pattern.compile("([a-z\\d])([A-Z])") | |||
private val regexp1: Pattern = Pattern.compile("([A-Z]+)([A-Z][a-z])") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since we don't need the class you added, please revert these formatting changes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed.
lazy final val namesToValuesMap: Map[String, A] = | ||
values.map(v => v.entryName -> v).toMap | ||
lazy val namesToValuesMap: Map[String, A] = | ||
values.map(v => v.entryName -> v)(breakOut) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not a fan of using breakOut
here; I know what it does, but:
- It's not obvious to beginners how it works;
- It'll likely be gone with the new collections lib
- This is a cached value; the so gains are pretty minimal.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tl;dr Removed breakOut
.
breakOut
is definitely complex since CanBuildFrom
isn't exactly the most intuitive concept, and I know that its days are numbered in Scala collections--though it isn't deprecated and probably won't be for some time. It just won't be necessary with the new views.
Also, breakOut
is a memory optimization to eliminate the need for an intermediate sequence--cached values or not. I worry that might matter when people use enums in "Big Data" (as with Apache Spark) scenarios, but it is definitely true that the sequences for most cases are so small that breakOut
probably doesn't change the world.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
First of all thanks so much ! This is great work. Just one small suggestion and I think we should be good to go.
For sanity, we should update the other Map
s, otherwise things can get weird.
@@ -38,7 +37,7 @@ trait Enum[A <: EnumEntry] { | |||
/** | |||
* Map of [[A]] object names to [[A]]s | |||
*/ | |||
lazy final val namesToValuesMap: Map[String, A] = | |||
lazy val namesToValuesMap: Map[String, A] = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice.
I think we should probably modify these Map
s to be in terms of namesToValuesMap
as well (I'd like to keep them final for now)
enumeratum/enumeratum-core/src/main/scala/enumeratum/Enum.scala
Lines 47 to 54 in c895c32
lazy final val lowerCaseNamesToValuesMap: Map[String, A] = | |
values.map(v => v.entryName.toLowerCase -> v).toMap | |
/** | |
* Map of [[A]] object names in upper case to [[A]]s for case-insensitive comparison | |
*/ | |
lazy final val upperCaseNameValuesToMap: Map[String, A] = | |
values.map(v => v.entryName.toUpperCase -> v).toMap |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you clarify what you mean here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right now, they're built in terms of values
directly, whereas I think they should be built in terms of namesToValuesMap
so that they can have the same values (in case the user overrides namesToValuesMap
and wants to use functions that call lowerCaseNamesToValuesMap
)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I got it.
Actually, the tests are failing with valid failures, See: https://travis-ci.org/lloydmeta/enumeratum/jobs/343869470#L2751
Pretty sure that's a fresh failure. Have you tried running the tests locally?? |
I ran The tests should pass now. |
Everything should be in order except with regard to that one clarification I need. Can you elaborate on that? Thanks. |
@neilchaudhuri sorry for the radio silence I'm currently away on a business trip. Will take a closer look and answer any questions when I'm back !! |
Oh OK. Good luck with the business and safe travels! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
I've just released this as part of 1.5.13 :) |
Awesome. Thanks. I hope people find the feature useful. |
Is there any documentation on how to use this? I'm not seeing |
enumeratum/enumeratum-core/src/test/scala/enumeratum/EnumSpec.scala Lines 438 to 442 in 87c4096
^ should show usage? |
@drewboardman , apparently this |
Adds support for
MultiEnum
, which maps multiple entries to a single enum. Also usesbreakOut
for some minor memory optimization.