summaryrefslogtreecommitdiff
path: root/misc/popsql/main.rb
blob: 3884e4afa372c73c17fa66d5f3a15ce8e98d906e (plain)
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
=begin
O(1) -> key -> location -> bucket

hash(x) -> int

-------
|     | [ [1, value], [4, value], [40, value] ]
-------
|     | [ [1, value] ]
-------
|     |
-------
=end

def assert_equals(x, y)
  raise [x, y].inspect unless x == y
end

class KV
  def initialize
    @items = Hash.new do |hash, key|
      hash[key] = []
    end
  end

  def set(key, value)
    @items[key] << [Time.now.to_i, value]
  end

  def get(key, at = nil)
    if at
      @items[key].bsearch { |(timestamp, _value)| timestamp <= at }&.at(-1)
    else
      @items[key].last&.at(-1)
    end
  end
end

kv = KV.new
kv.set('foo', 'bar')

# challenge 1
assert_equals(kv.get('foo'), 'bar')

kv.set(42, 'forty two')
assert_equals(kv.get(42), 'forty two')
assert_equals(kv.get('baz'), nil)

# challenge 2
kv.set('foo', 'bar')
now = Time.now.to_i

sleep(3)
kv.set('foo', 'bar2')

assert_equals(kv.get('foo'), 'bar2')
assert_equals(kv.get('foo', now), 'bar')

# challenge 3
assert_equals(kv.get('foo', now + 1), 'bar')
assert_equals(kv.get('foo', now + 2), 'bar')
puts 'yay!'