Class: ULID::MonotonicGenerator
- Inherits:
-
Object
- Object
- ULID::MonotonicGenerator
- Includes:
- MonitorMixin
- Defined in:
- lib/ulid/monotonic_generator.rb
Instance Attribute Summary collapse
- #last ⇒ ULID? readonly
Instance Method Summary collapse
-
#encode(moment: Utils.current_milliseconds) ⇒ String
Just providing similar api as ‘ULID.generate` and `ULID.encode` relation.
- #freeze ⇒ void
- #generate(moment: Utils.current_milliseconds) ⇒ ULID
-
#initialize ⇒ MonotonicGenerator
constructor
A new instance of MonotonicGenerator.
- #inspect ⇒ String (also: #to_s)
Constructor Details
#initialize ⇒ MonotonicGenerator
Returns a new instance of MonotonicGenerator.
22 23 24 25 |
# File 'lib/ulid/monotonic_generator.rb', line 22 def initialize super @last = nil end |
Instance Attribute Details
Instance Method Details
#encode(moment: Utils.current_milliseconds) ⇒ String
Just providing similar api as ‘ULID.generate` and `ULID.encode` relation. No performance benefit exists in monotonic generator’s one.
80 81 82 |
# File 'lib/ulid/monotonic_generator.rb', line 80 def encode(moment: Utils.current_milliseconds) generate(moment:).encode end |
#freeze ⇒ void
This method returns an undefined value.
88 89 90 |
# File 'lib/ulid/monotonic_generator.rb', line 88 def freeze raise(TypeError, "cannot freeze #{self.class}") end |
#generate(moment: Utils.current_milliseconds) ⇒ ULID
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 |
# File 'lib/ulid/monotonic_generator.rb', line 38 def generate(moment: Utils.current_milliseconds) synchronize do prev = @last unless prev ret = ULID.generate(moment:) @last = ret return ret end milliseconds = Utils.milliseconds_from_moment(moment) ulid = ( if prev.milliseconds < milliseconds ULID.generate(moment: milliseconds) else ULID.generate(moment: prev.milliseconds, entropy: prev.entropy.succ) end ) unless ulid > prev = "monotonicity broken from unexpected reasons # generated: #{ulid.inspect}, prev: #{prev.inspect}" additional_information = ( if Thread.list == [Thread.main] '# NOTE: looks single thread only exist' else '# NOTE: ran on multi threads, so this might from concurrency issue' end ) raise(UnexpectedError, + additional_information) end @last = ulid ulid end end |
#inspect ⇒ String Also known as: to_s
28 29 30 |
# File 'lib/ulid/monotonic_generator.rb', line 28 def inspect "ULID::MonotonicGenerator(last: #{@last.inspect})" end |