Skip to content
This repository was archived by the owner on Apr 25, 2020. It is now read-only.

Commit 8137684

Browse files
committed
Things are more typesafe now
1 parent e8a30c1 commit 8137684

File tree

5 files changed

+76
-86
lines changed

5 files changed

+76
-86
lines changed

pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
<groupId>com.ckkloverdos</groupId>
2828
<artifactId>typedkey</artifactId>
29-
<version>0.4.0-SNAPSHOT</version>
29+
<version>0.5.0-SNAPSHOT</version>
3030
<packaging>jar</packaging>
3131

3232
<name>Typedkey</name>
@@ -81,7 +81,7 @@
8181
<dependency>
8282
<groupId>com.ckkloverdos</groupId>
8383
<artifactId>maybe</artifactId>
84-
<version>0.4.0-SNAPSHOT</version>
84+
<version>0.5.0-SNAPSHOT</version>
8585
</dependency>
8686
<dependency>
8787
<groupId>junit</groupId>

src/main/scala/com/ckkloverdos/env/Env.scala

+18-9
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,35 @@
1616

1717
package com.ckkloverdos.env
1818

19-
import com.ckkloverdos.key.TypedKey
2019
import com.ckkloverdos.maybe.{NoVal, Maybe}
20+
import com.ckkloverdos.key._
2121

22-
class Env(val map: Map[TypedKey[_], Any] = Map()) {
22+
class Env private[env](private val map: Map[TypedKey[_], Any]) {
2323
/**
2424
* Get a value or throw an exception if it does not exist.
2525
*/
2626
@throws(classOf[NoSuchElementException])
27+
@throws(classOf[ClassCastException])
2728
def getEx[T : Manifest](key: TypedKey[T]): T = {
2829
map(key).asInstanceOf[T]
2930
}
3031

3132
def get[T : Manifest](key: TypedKey[T]): Maybe[T] = {
3233
map.get(key) match {
33-
case Some(value) Maybe(value.asInstanceOf[T])
34-
case None NoVal
34+
case Some(value)
35+
Maybe(value).castTo[T]
36+
case None
37+
NoVal
3538
}
3639
}
40+
41+
def +[T : Manifest](key: TypedKey[T], value: T): Env = new Env(map + (key -> value))
42+
43+
def +[T : Manifest](kv: (TypedKey[T], T)): Env = new Env(map + kv)
3744

38-
def ++(other: Map[TypedKey[_], Any]): Env = new Env(map ++ other)
39-
def ++(other: Env): Env = new Env(this.map ++ other.map)
45+
def +(kv: (String, Env)): Env = this + (EnvKey(kv._1), kv._2)
46+
47+
def ++(other: Env): Env = new Env(other.map ++ map)
4048

4149
override def hashCode() = map.##
4250
override def equals(any: Any): Boolean = {
@@ -74,13 +82,14 @@ class Env(val map: Map[TypedKey[_], Any] = Map()) {
7482

7583
def selectType[T : Manifest]: Env =
7684
new Env(Map(keysOfType[T].toSeq.map(tk => (tk, map(tk))): _*))
85+
7786

7887
def contains[T : Manifest](key: TypedKey[T]): Boolean = {
7988
map.contains(key)
8089
}
90+
}
8191

82-
def toBuilder = new EnvBuilder(map)
83-
84-
92+
object Env {
93+
def apply() = new Env(Map())
8594
}
8695

src/main/scala/com/ckkloverdos/env/EnvBuilder.scala

-41
This file was deleted.

src/main/scala/com/ckkloverdos/key/typedkey.scala

+20-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
package com.ckkloverdos.key
1818

19+
import com.ckkloverdos.env.Env
20+
import com.ckkloverdos.maybe.Maybe
21+
import com.ckkloverdos.key.TypedKey.FromEnvTypedKey
22+
1923
/**
2024
* A key with a specific type attached.
2125
*
@@ -43,12 +47,22 @@ abstract class TypedKeySkeleton[T: Manifest](val name: String) extends TypedKey[
4347
case _ => false
4448
}
4549

46-
override def toString =
47-
{
48-
val cname = getClass.getName
49-
val shortName = cname.substring(cname.lastIndexOf('.') + 1)
50-
"%s[%s](%s)".format(shortName, keyType, name)
51-
}
50+
// override def toString =
51+
// {
52+
// val cname = getClass.getName
53+
// val shortName = cname.substring(cname.lastIndexOf('.') + 1)
54+
// "%s[%s](%s)".format(shortName, keyType, name)
55+
// }
5256

5357
def compare(that: TypedKey[_]) = this.name compareTo that.name
58+
}
59+
60+
object TypedKey {
61+
final class FromEnvTypedKey[T: Manifest](key: TypedKey[T]) {
62+
def from(env: Env): Maybe[T] = env.get(key)
63+
}
64+
65+
implicit def typedKeyWithFrom[T: Manifest](key: TypedKey[T]): FromEnvTypedKey[T] = {
66+
new FromEnvTypedKey(key)
67+
}
5468
}

src/test/scala/com/ckkloverdos/env/EnvTest.scala

+36-28
Original file line numberDiff line numberDiff line change
@@ -17,49 +17,57 @@ package com.ckkloverdos.env
1717

1818
import org.junit.Assert
1919
import org.junit.Test
20-
import com.ckkloverdos.key.{IntKey, StringKey}
2120
import com.ckkloverdos.maybe.Just
21+
import com.ckkloverdos.key.{DoubleKey, IntKey, StringKey}
2222

2323
/**
2424
*
2525
* @author Christos KK Loverdos <loverdos@gmail.com>
2626
*/
2727
class EnvTest {
28-
val Hello_World = "Hello.World"
29-
val Just_another_Key = "Just.another.Key"
28+
val KeyName_1 = "it's.key"
29+
val KeyName_2 = "just.another.key"
30+
val KeyName_3 = "day.in.paradise.key"
3031

31-
val strKey1 = StringKey(Hello_World)
32-
val strVal1 = "Value 1"
33-
val intKey1 = IntKey(Just_another_Key)
34-
val intVal1 = 12
35-
val strKey2 = StringKey(Just_another_Key)
36-
val strVal2 = "Value 2"
37-
val intKey2 = IntKey(Hello_World)
38-
val intVal2 = 500
32+
val key1_str = StringKey(KeyName_1)
33+
val val1_str = "Value 1"
34+
val key2_int = IntKey(KeyName_2)
35+
val val2_int = 12
36+
val key3_str = StringKey(KeyName_2)
37+
val val3_str = "Value 2"
38+
val key4_int = IntKey(KeyName_1)
39+
val val4_int = 500
40+
val key5_double = DoubleKey(KeyName_3)
41+
val val5_double = 1.0
3942

40-
lazy val envb = new EnvBuilder() +
41-
(strKey1, strVal1) +
42-
(intKey1, intVal1) +
43-
(intKey2, intVal2) +
44-
(strKey2, strVal2)
45-
46-
lazy val env = envb.build
43+
val env = Env() +
44+
(key1_str, val1_str) +
45+
(key2_int, val2_int) +
46+
(key3_str, val3_str) +
47+
(key4_int, val4_int) +
48+
(key5_double, val5_double)
4749

4850
@Test
4951
def testStringKey: Unit = {
50-
val strValue = env.get(strKey1)
51-
Assert.assertEquals(Just(strVal1), strValue)
52+
val strValue = env.get(key1_str)
53+
Assert.assertEquals(Just(val1_str), strValue)
5254
}
5355

5456
@Test
5557
def testIntKey: Unit = {
56-
val intValue = env.get(intKey1)
57-
Assert.assertEquals(Just(intVal1), intValue)
58+
val intValue = env.get(key2_int)
59+
Assert.assertEquals(Just(val2_int), intValue)
60+
}
61+
62+
@Test
63+
def testDoubleKey: Unit = {
64+
val doubleValue = env.get(key5_double)
65+
Assert.assertEquals(Just(val5_double), doubleValue)
5866
}
5967

6068
@Test
6169
def testKeysOfType: Unit = {
62-
val expectedSet = Set(strKey1, strKey2)
70+
val expectedSet = Set(key1_str, key3_str)
6371
val computedSet = env.keysOfType[String]
6472
Assert.assertEquals(expectedSet, computedSet)
6573
}
@@ -69,15 +77,15 @@ class EnvTest {
6977
val computedEnv = env.selectType[String]
7078

7179
Assert.assertEquals(2, computedEnv.size)
72-
Assert.assertFalse(strKey1 == strKey2)
73-
Assert.assertTrue(computedEnv.contains(strKey1))
74-
Assert.assertTrue(computedEnv.contains(strKey2))
80+
Assert.assertFalse(key1_str == key3_str)
81+
Assert.assertTrue(computedEnv.contains(key1_str))
82+
Assert.assertTrue(computedEnv.contains(key3_str))
7583
}
7684

7785
@Test
7886
def testKeysOfName: Unit = {
79-
val expectedSet = Set(strKey1, intKey2)
80-
val computedSet = env.keysOfName(Hello_World)
87+
val expectedSet = Set(key1_str, key4_int)
88+
val computedSet = env.keysOfName(KeyName_1)
8189
Assert.assertEquals(expectedSet, computedSet)
8290
}
8391
}

0 commit comments

Comments
 (0)