class Ollama::Documents::RedisCache

def [](key)

def [](key)
  value = redis.get(pre(key))
  unless value.nil?
    JSON(value, object_class:)
  end
end

def []=(key, value)

def []=(key, value)
  set(key, value)
end

def clear

def clear
  redis.scan_each(match: "#@prefix*") { |key| redis.del(key) }
  self
end

def delete(key)

def delete(key)
  redis.del(pre(key)) == 1
end

def each(&block)

def each(&block)
  redis.scan_each(match: "#@prefix*") { |key| block.(key, self[unpre(key)]) }
  self
end

def full_each(&block)

def full_each(&block)
  redis.scan_each(match: [ Ollama::Documents, ?* ] * ?-) do |key|
    value = redis.get(key) or next
    value = JSON(value, object_class: Ollama::Documents::Record)
    block.(key, value)
  end
end

def initialize(prefix:, url: ENV['REDIS_URL'], object_class: nil, ex: nil)

def initialize(prefix:, url: ENV['REDIS_URL'], object_class: nil, ex: nil)
  url or raise ArgumentError, 'require redis url'
  @prefix, @url, @object_class, @ex = prefix, url, object_class, ex
end

def key?(key)

def key?(key)
  !!redis.exists?(pre(key))
end

def redis

def redis
  @redis ||= Redis.new(url: @url)
end

def set(key, value, ex: nil)

def set(key, value, ex: nil)
  ex ||= @ex
  if !ex.nil? && ex < 1
    redis.del(pre(key))
  else
    redis.set(pre(key), JSON.generate(value), ex:)
  end
  value
end

def size

def size
  s = 0
  redis.scan_each(match: "#@prefix*") { |key| s += 1 }
  s
end

def ttl(key)

def ttl(key)
  redis.ttl(pre(key))
end