scala-common


License

License

Categories

Categories

Scala Languages
GroupId

GroupId

ru.ars-co
ArtifactId

ArtifactId

scala-common_2.11
Last Version

Last Version

0.0.4
Release Date

Release Date

Type

Type

jar
Description

Description

scala-common
scala-common
Project URL

Project URL

https://github.com/ArsCo/scala-common
Project Organization

Project Organization

ru.ars-co
Source Code Management

Source Code Management

https://github.com/ArsCo/scala-common

Download scala-common_2.11

How to add to project

<!-- https://jarcasting.com/artifacts/ru.ars-co/scala-common_2.11/ -->
<dependency>
    <groupId>ru.ars-co</groupId>
    <artifactId>scala-common_2.11</artifactId>
    <version>0.0.4</version>
</dependency>
// https://jarcasting.com/artifacts/ru.ars-co/scala-common_2.11/
implementation 'ru.ars-co:scala-common_2.11:0.0.4'
// https://jarcasting.com/artifacts/ru.ars-co/scala-common_2.11/
implementation ("ru.ars-co:scala-common_2.11:0.0.4")
'ru.ars-co:scala-common_2.11:jar:0.0.4'
<dependency org="ru.ars-co" name="scala-common_2.11" rev="0.0.4">
  <artifact name="scala-common_2.11" type="jar" />
</dependency>
@Grapes(
@Grab(group='ru.ars-co', module='scala-common_2.11', version='0.0.4')
)
libraryDependencies += "ru.ars-co" % "scala-common_2.11" % "0.0.4"
[ru.ars-co/scala-common_2.11 "0.0.4"]

Dependencies

compile (3)

Group / Artifact Type Version
org.scala-lang : scala-library jar 2.11.8
ru.ars-co : scala-preconditions_2.11 jar 0.1.2
com.typesafe.scala-logging : scala-logging_2.11 jar 3.7.2

test (3)

Group / Artifact Type Version
org.scalatest : scalatest_2.11 jar 3.0.0
ch.qos.logback : logback-classic jar 1.2.3
net.logstash.logback : logstash-logback-encoder jar 5.0

Project Modules

There are no modules declared in this project.

scala-common

Maven Central Maven Central

Coverage Status Licence Latest release Code quality Gitterchat

Scala library that provides common code part or templates

Features:

  • enumeration pattern
    • enumeration value trait EnumValue
      • enumeration value code
      • enumeration value name
      • common toString method implementation
    • enumeration object trait EnumObject
      • common values method
      • common valueOf method
  • serializable enumeration pattern
    • all features of enumeration pattern
    • standard Java serialization/deserialization
  • Scala 2.11 and 2.12

Usage

Add dependency to build.sbt:

libraryDependencies +=  "ru.ars-co" %% "scala-common" % currentVersion

Implement enumeration:

sealed abstract class MyIntEnumValue(override val code: Int) extends EnumValue[Int]

object MyIntEnumValues extends EnumObject[MyIntEnumValue, Int] {
  final case object FirstValue  extends MyIntEnumValue(1)
  final case object SecondValue extends MyIntEnumValue(2)
  final case object ThirdValue  extends MyIntEnumValue(3)

  override def values: Seq[MyIntEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

Use enumeration:

MyIntEnumValues.ThirdValue
MyIntEnumValues.FirstValue.code

Basic enum implementation

To implement basic enum:

  1. create enum value class by extending EnumValue trait
    1. override code method
  2. create enum values objects by extending EnumObject trait
    1. create final case object for each enum value
    2. override values method with Seq of all enum value objects

Examples:

sealed abstract class MyIntEnumValue(override val code: Int) extends EnumValue[Int]

object MyIntEnumValues extends EnumObject[MyIntEnumValue, Int] {
  final case object FirstValue  extends MyIntEnumValue(1)
  final case object SecondValue extends MyIntEnumValue(2)
  final case object ThirdValue  extends MyIntEnumValue(3)

  override def values: Seq[MyIntEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

sealed abstract class MyStringEnumValue(override val code: String) extends EnumValue[String]

object MyStringEnumValues extends EnumObject[MyStringEnumValue, String] {
  final case object FirstValue  extends MyStringEnumValue("first")
  final case object SecondValue extends MyStringEnumValue("second")
  final case object ThirdValue  extends MyStringEnumValue("third")

  override def values: Seq[MyStringEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

Java serializable Int- and String-based enum implementation

There are 2 ways to implement enumeration: trait-based and abstract class-based. The first is better when you want to subclass enum class from another class but need more code to write. The last one provides more concise code but you need to implement objectTypeTag() method manually.

Trait-based realization

To implement Java serializable enum:

  1. create enum value class by extending SerializableIntEnumValue or SerializableStringEnumValue abstract class.
    1. override code method
    2. override objectTypeTag() method
  2. create enum values objects by extending EnumObject trait
    1. create final case object for each enum value
    2. override values method with Seq of all enum value objects

Examples:

sealed abstract class MyIntEnumValue(override val code: Int) 
  extends SerializableIntEnumValue[MyEnumValue, MyEnumValues.type] {
  
  override protected[this] val objectTypeTag: TypeTag[MyIntEnumValues.type] = typeTag[MyIntEnumValues.type]
}

object MyIntEnumValues extends EnumObject[MyIntEnumValue, Int] {
  final case object FirstValue extends MyIntEnumValue(1)
  final case object SecondValue extends MyIntEnumValue(2)
  final case object ThirdValue extends MyIntEnumValue(3)

  override def values: Seq[MyIntEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

sealed abstract class MyStringEnumValue(override val code: String) 
  extends SerializableStringEnumValue[MyEnumValue, MyEnumValues.type] {
  
    override protected[this] val objectTypeTag: TypeTag[MyStringEnumValues.type] = typeTag[MyStringEnumValues.type]
}

object MyStringEnumValues extends EnumObject[MyStringEnumValue, String] {
  final case object FirstValue  extends MyStringEnumValue("first")
  final case object SecondValue extends MyStringEnumValue("second")
  final case object ThirdValue  extends MyStringEnumValue("third")

  override def values: Seq[MyStringEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

Abstract-based realization

To implement Java serializable enum:

  1. create enum value class by extending AbstractSerializableIntEnumValue or AbstractSerializableStringEnumValue abstract class.
    1. override code method
  2. create enum values objects by extending EnumObject trait
    1. create final case object for each enum value
    2. override values method with Seq of all enum value objects

Examples:

sealed abstract class MyIntEnumValue(override val code: Int) 
  extends AbstractSerializableIntEnumValue[MyEnumValue, MyEnumValues.type]

object MyIntEnumValues extends EnumObject[MyIntEnumValue, Int] {
  final case object FirstValue extends MyIntEnumValue(1)
  final case object SecondValue extends MyIntEnumValue(2)
  final case object ThirdValue extends MyIntEnumValue(3)

  override def values: Seq[MyIntEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

sealed abstract class MyStringEnumValue(override val code: String) 
  extends AbstractSerializableStringEnumValue[MyEnumValue, MyEnumValues.type]

object MyStringEnumValues extends EnumObject[MyStringEnumValue, String] {
  final case object FirstValue  extends MyStringEnumValue("first")
  final case object SecondValue extends MyStringEnumValue("second")
  final case object ThirdValue  extends MyStringEnumValue("third")

  override def values: Seq[MyStringEnumValue] = Seq(FirstValue, SecondValue, ThirdValue)
}

Copyright

Copyright 2018 Arsen Ibragimov (ars)

Versions

Version
0.0.4