module Trav3 class Options def initialize(**args) build(**args) end def opts if @opts.empty? '' else "?#{@opts.join('&')}" end end def build(**args) @opts ||= [] args.each do |(key, value)| remove(key) @opts.push("#{key}=#{value}") end self end def remove(key) return_value = nil @opts = @opts.delete_if do |item| head, tail = split.call item return_value = tail if head == key.to_s end return_value end def reset! @opts = [] end def +(other) raise TypeError, "Options type expected, #{other.class} given" unless other.is_a? Options @opts += other.instance_variable_get(:@opts) self end def to_s opts end def to_h @opts.map(&split).to_h end private def split ->(entry) { entry.split('=') } end end end