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

Class Method Details

.after(pos) ⇒ String

Generate a position just after the given position.

Parameters:

  • pos (String)

    Existing 6-char B36TS position

Returns:

  • (String)

    6-char B36TS position slightly after pos



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.

Parameters:

  • pos (String)

    Existing 6-char B36TS position

Returns:

  • (String)

    6-char B36TS position slightly before pos



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.

Parameters:

  • a (String)

    Lower 6-char B36TS position

  • b (String)

    Upper 6-char B36TS position

Returns:

  • (String)

    6-char B36TS position between a and b



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

.firstString

Generate a very early position (sorts before all normal timestamps). Uses a fixed early time to ensure it sorts first.

Returns:

  • (String)

    6-char B36TS position



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

.lastString

Generate a position at current time (sorts after all existing items).

Returns:

  • (String)

    6-char B36TS position



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