-
Notifications
You must be signed in to change notification settings - Fork 100
/
Timestamp.scala
117 lines (104 loc) · 3.31 KB
/
Timestamp.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
* Copyright 2018-2023 OVO Energy Limited
*
* SPDX-License-Identifier: Apache-2.0
*/
package fs2.kafka
import cats.{Eq, Show}
import cats.syntax.eq._
import cats.instances.long._
import cats.instances.option._
import cats.instances.boolean._
/**
* [[Timestamp]] is an optional timestamp value representing
* a [[createTime]], [[logAppendTime]], [[unknownTime]], or
* no timestamp at all.
*/
sealed abstract class Timestamp {
/**
* Returns the timestamp value, if the timestamp is
* representing the time when a record was created.
*/
def createTime: Option[Long]
/**
* Returns the timestamp value, if the timestamp is
* representing the time when a record was appended
* to the log.
*/
def logAppendTime: Option[Long]
/**
* Returns the timestamp value, if there is a
* timestamp, but the type is unknown.
*/
def unknownTime: Option[Long]
/**
* Returns `true` if there is no timestamp value; otherwise `false`.
*/
def isEmpty: Boolean
/**
* Returns `true` if there is a timestamp value; otherwise `false`.
*/
final def nonEmpty: Boolean =
!isEmpty
}
object Timestamp {
/**
* Creates a new [[Timestamp]] instance from the specified
* timestamp value representing the time when the record
* was created.
*/
def createTime(value: Long): Timestamp =
new Timestamp {
override val createTime: Option[Long] = Some(value)
override val logAppendTime: Option[Long] = None
override val unknownTime: Option[Long] = None
override val isEmpty: Boolean = false
override def toString: String = s"Timestamp(createTime = $value)"
}
/**
* Creates a new [[Timestamp]] instance from the specified
* timestamp value representing the time when the record
* was appended to the log.
*/
def logAppendTime(value: Long): Timestamp =
new Timestamp {
override val createTime: Option[Long] = None
override val logAppendTime: Option[Long] = Some(value)
override val unknownTime: Option[Long] = None
override val isEmpty: Boolean = false
override def toString: String = s"Timestamp(logAppendTime = $value)"
}
/**
* Creates a new [[Timestamp]] instance from the specified
* timestamp value, when the timestamp type is unknown.
*/
def unknownTime(value: Long): Timestamp =
new Timestamp {
override val createTime: Option[Long] = None
override val logAppendTime: Option[Long] = None
override val unknownTime: Option[Long] = Some(value)
override val isEmpty: Boolean = false
override def toString: String = s"Timestamp(unknownTime = $value)"
}
/**
* The [[Timestamp]] instance without any timestamp values.
*/
val none: Timestamp =
new Timestamp {
override val createTime: Option[Long] = None
override val logAppendTime: Option[Long] = None
override val unknownTime: Option[Long] = None
override val isEmpty: Boolean = true
override def toString: String = "Timestamp()"
}
implicit val timestampShow: Show[Timestamp] =
Show.fromToString
implicit val timestampEq: Eq[Timestamp] =
Eq.instance {
case (l, r) =>
l.createTime === r.createTime &&
l.logAppendTime === r.logAppendTime &&
l.unknownTime === r.unknownTime &&
l.isEmpty === r.isEmpty
}
}