Class: Nagoriyuki

Inherits:
Object
  • Object
show all
Defined in:
lib/nagoriyuki.rb,
lib/nagoriyuki/version.rb,
lib/nagoriyuki/generators.rb,
lib/nagoriyuki/generators/pid.rb,
lib/nagoriyuki/generators/base.rb,
lib/nagoriyuki/generators/msec.rb,
lib/nagoriyuki/generators/sequence.rb

Defined Under Namespace

Modules: Generators Classes: InvalidOption

Constant Summary collapse

VERSION =
"0.0.2"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Nagoriyuki

generators:

- name: msec
  length: 40 # (2 ** 40 - 1) / 1000 / 365 / 24 / 60 / 60.0
  start_at: 1546268400000 # 2019-01-01 00:00:00 +0900 (msec)
- name: pid
  length: 16
- name: sequence
  length: 8


22
23
24
25
26
27
28
29
# File 'lib/nagoriyuki.rb', line 22

def initialize(options = {})
  @options = options
  @lock = Mutex.new
  @generators = @options["generators"].map do |h|
    generator_name = h["name"]
    "Nagoriyuki::Generators::#{generator_name.classify}".constantize.new(h)
  end
end

Instance Attribute Details

#generatorsObject (readonly)

Returns the value of attribute generators.



11
12
13
# File 'lib/nagoriyuki.rb', line 11

def generators
  @generators
end

Instance Method Details

#biggest(timestamp) ⇒ Object



68
69
70
71
72
73
74
75
76
# File 'lib/nagoriyuki.rb', line 68

def biggest(timestamp)
  @lock.synchronize do
    shift_size = length
    @generators.inject(0) do |result, generator|
      shift_size = shift_size - generator.length
      result += generator.biggest(timestamp) << shift_size
    end
  end
end

#currentObject



42
43
44
45
46
47
48
49
50
# File 'lib/nagoriyuki.rb', line 42

def current
  @lock.synchronize do
    shift_size = length
    @generators.inject(0) do |result, generator|
      shift_size = shift_size - generator.length
      result += generator.current << shift_size
    end
  end
end

#generateObject Also known as: next



31
32
33
34
35
36
37
38
39
# File 'lib/nagoriyuki.rb', line 31

def generate
  @lock.synchronize do
    shift_size = length
    @generators.inject(0) do |result, generator|
      shift_size = shift_size - generator.length
      result += generator.generate << shift_size
    end
  end
end

#lengthObject



78
79
80
# File 'lib/nagoriyuki.rb', line 78

def length
  @generators.inject(0) {|sum, g| sum += g.length }
end

#smallest(timestamp) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/nagoriyuki.rb', line 58

def smallest(timestamp)
  @lock.synchronize do
    shift_size = length
    @generators.inject(0) do |result, generator|
      shift_size = shift_size - generator.length
      result += generator.smallest(timestamp) << shift_size
    end
  end
end

#timestamp(id) ⇒ Object



52
53
54
55
56
# File 'lib/nagoriyuki.rb', line 52

def timestamp(id)
  generator = @generators.detect {|g| g.name == "msec" }
  shift_size = length - generator.length
  ((id >> shift_size) + generator.offset_epoch) / 1000
end