-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
ObjectStoreDef.scala
86 lines (65 loc) · 2.14 KB
/
ObjectStoreDef.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package japgolly.webapputil.indexeddb
import japgolly.scalajs.react.{AsyncCallback, CallbackTo}
import japgolly.univeq.UnivEq
import org.scalajs.dom.IDBValue
sealed trait ObjectStoreDef[K, V] {
val name: String
val keyCodec: KeyCodec[K]
final type Key = K
def sync: ObjectStoreDef.Sync[K, _]
}
object ObjectStoreDef {
final case class Sync[K, V](name : String,
keyCodec : KeyCodec[K],
valueCodec: ValueCodec[V]) extends ObjectStoreDef[K, V] {
type Value = V
override def sync: this.type =
this
}
// ===================================================================================================================
final case class Async[K, V](name : String,
keyCodec : KeyCodec[K],
valueCodec: ValueCodec.Async[V]) extends ObjectStoreDef[K, V] { self =>
type Value = Async.Value {
type KeyType = K
type ValueType = V
val store: self.type
}
def encode(v: V): AsyncCallback[Value] =
valueCodec.encode(v).map(value)
def value(v: IDBValue): Value =
new Async.Value {
override type KeyType = K
override type ValueType = V
override val store: self.type = self
override val value = v
}
override val sync: Sync[K, Value] = {
val syncValueCodec = ValueCodec[Value](
encode = v => CallbackTo.pure(v.value),
decode = v => CallbackTo.pure(value(v)),
)
Sync(name, keyCodec, syncValueCodec)
}
}
object Async {
sealed trait Value {
type KeyType
type ValueType
val store: Async[KeyType, ValueType]
val value: IDBValue
final def decode: AsyncCallback[ValueType] =
store.valueCodec.decode(value)
final override def hashCode =
store.name.hashCode * 29 + value.##
final override def equals(o: Any) =
o match {
case x: Value => store.name == x.store.name && value == x.value
case _ => false
}
}
object Value {
implicit def univEq[V <: Value]: UnivEq[V] = UnivEq.force
}
}
}