# frozen_string_literal: true class ExpiringLock def initialize(name, expiry: 60 * 60 * 24) @name = name @expiry = expiry end def with(els=nil) REDIS.exists(@name).then do |exists| next els&.call if exists == 1 EMPromise.resolve(yield).then do |rval| REDIS.setex(@name, @expiry, "").then { rval } end end end end