module Hamster

def self.hash(pairs = {})

def self.hash(pairs = {})
  pairs.reduce(Hash.new) { |hash, pair| hash.put(pair.first, pair.last) }
end

def self.set(*items)

def self.set(*items)
  items.reduce(Set.new) { |set, item| set.add(item) }
end

def self.stack(*items)

def self.stack(*items)
  items.reduce(EmptyStack) { |stack, item| stack.push(item) }
end

def interval(from, to)

def interval(from, to)
  return EmptyList if from > to
  Stream.new(from) { interval(from.succ, to) }
end

def iterate(item, &block)

def iterate(item, &block)
  Stream.new(item) { iterate(yield(item), &block) }
end

def list(*items)

def list(*items)
  items.reverse.reduce(EmptyList) { |list, item| list.cons(item) }
end

def repeat(item)

def repeat(item)
  Stream.new(item) { repeat(item) }
end

def replicate(number, item)

def replicate(number, item)
  repeat(item).take(number)
end

def stream(&block)

def stream(&block)
  return EmptyList unless block_given?
  Stream.new(yield) { stream(&block) }
end