# Map is a key-value collection. Keys are strings; values are arbitrary values.
# This class adds filtering and predicate helpers on top of each and lookup.
#
class Map {
# Returns a new map containing only pairs for which the block returns true.
#
# { name: "Alice", age: 30 }.select { |k, v| v == 30 } # { age: 30 }
#
def select {
result = {}
each { |k, v| result[k] = v if yield(k, v) }
result
}
# Returns true if the block returns a truthy value for at least one pair.
#
# { a: 1, b: 2 }.any? { |k, v| v > 1 } # true
# { a: 1, b: 2 }.any? { |k, v| v > 9 } # false
#
def any?() {
each { |k, v| return true if yield(k, v) }
false
}
# Returns true if the block returns a truthy for every pair. Empty maps are true.
#
# { a: 1, b: 2 }.all? { |k, v| v > 0 } # true
# { a: 1, b: 2 }.all? { |k, v| v > 1 } # false
#
def all?() {
each { |k, v| return false if !yield(k, v) }
true
}
# Returns true if the block never returns a truthy value (empty maps are true).
#
# { a: 1, b: 2 }.none? { |k, v| v > 9 } # true
# { a: 1, b: 2 }.none? { |k, v| v > 1 } # false
#
def none?() {
each { |k, v| return false if yield(k, v) }
true
}
}