Module: Ace::Support::Items::Atoms::PositionGenerator
- Defined in:
- lib/ace/support/items/atoms/position_generator.rb
Overview
Generates B36TS position values for pinning items in sort order. Position values are 6-char B36TS strings that sort lexicographically = chronologically.
Constant Summary collapse
- OFFSET_SECONDS =
Increment/decrement in seconds for before/after positioning. ~2 seconds precision in B36TS, so 4 seconds ensures a distinct value.
4
Class Method Summary collapse
-
.after(pos) ⇒ String
Generate a position just after the given position.
-
.before(pos) ⇒ String
Generate a position just before the given position.
-
.between(a, b) ⇒ String
Generate a position between two existing positions.
-
.first ⇒ String
Generate a very early position (sorts before all normal timestamps).
-
.last ⇒ String
Generate a position at current time (sorts after all existing items).
Class Method Details
.after(pos) ⇒ String
Generate a position just after the given position.
34 35 36 37 38 |
# File 'lib/ace/support/items/atoms/position_generator.rb', line 34 def self.after(pos) require "ace/b36ts" time = Ace::B36ts.decode(pos) Ace::B36ts.encode(time + OFFSET_SECONDS) end |
.before(pos) ⇒ String
Generate a position just before the given position.
43 44 45 46 47 |
# File 'lib/ace/support/items/atoms/position_generator.rb', line 43 def self.before(pos) require "ace/b36ts" time = Ace::B36ts.decode(pos) Ace::B36ts.encode(time - OFFSET_SECONDS) end |
.between(a, b) ⇒ String
Generate a position between two existing positions.
53 54 55 56 57 58 59 |
# File 'lib/ace/support/items/atoms/position_generator.rb', line 53 def self.between(a, b) require "ace/b36ts" time_a = Ace::B36ts.decode(a) time_b = Ace::B36ts.decode(b) midpoint = Time.at((time_a.to_f + time_b.to_f) / 2).utc Ace::B36ts.encode(midpoint) end |
.first ⇒ String
Generate a very early position (sorts before all normal timestamps). Uses a fixed early time to ensure it sorts first.
17 18 19 20 21 22 |
# File 'lib/ace/support/items/atoms/position_generator.rb', line 17 def self.first require "ace/b36ts" # Year 2020, Jan 1 — well before any real item creation early_time = Time.utc(2020, 1, 1) Ace::B36ts.encode(early_time) end |
.last ⇒ String
Generate a position at current time (sorts after all existing items).
26 27 28 29 |
# File 'lib/ace/support/items/atoms/position_generator.rb', line 26 def self.last require "ace/b36ts" Ace::B36ts.encode(Time.now.utc) end |