Class TreeMultiMap<K, V, R>

TreeMultiMap (ordered MultiMap) — key → bucket (Array of values).

Semantics (RFC):

  • Bucketed design: each key appears once; duplicates live in the bucket.
  • get(key) returns a live bucket reference.
  • Default iteration yields bucket entries: [K, V[]].
  • Navigable operations (first/last/ceiling/...) return entry tuples like TreeMap.
// players ranked by score with their equipment
type Equipment = {
name: string; // Equipment name
quality: 'legendary' | 'epic' | 'rare' | 'common';
level: number;
};

type Player = {
name: string;
score: number;
equipments: Equipment[];
};

// Mock player data with their scores and equipment
const players: Player[] = [
{
name: 'DragonSlayer',
score: 8750,
equipments: [
{ name: 'AWM', quality: 'legendary', level: 85 },
{ name: 'Level 3 Helmet', quality: 'epic', level: 80 },
{ name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
{ name: 'Compensator', quality: 'epic', level: 78 },
{ name: 'Vertical Grip', quality: 'rare', level: 72 }
]
},
{
name: 'ShadowNinja',
score: 7200,
equipments: [
{ name: 'M416', quality: 'epic', level: 75 },
{ name: 'Ghillie Suit', quality: 'rare', level: 70 },
{ name: 'Red Dot Sight', quality: 'common', level: 65 },
{ name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
]
},
{
name: 'RuneMaster',
score: 9100,
equipments: [
{ name: 'KAR98K', quality: 'legendary', level: 90 },
{ name: 'Level 3 Vest', quality: 'legendary', level: 85 },
{ name: 'Holographic Sight', quality: 'epic', level: 82 },
{ name: 'Suppressor', quality: 'legendary', level: 88 },
{ name: 'Level 3 Backpack', quality: 'epic', level: 80 }
]
},
{
name: 'BattleKing',
score: 8500,
equipments: [
{ name: 'AUG', quality: 'epic', level: 82 },
{ name: 'Red Dot Sight', quality: 'rare', level: 75 },
{ name: 'Extended Mag', quality: 'common', level: 70 },
{ name: 'Tactical Stock', quality: 'rare', level: 76 }
]
},
{
name: 'SniperElite',
score: 7800,
equipments: [
{ name: 'M24', quality: 'legendary', level: 88 },
{ name: 'Compensator', quality: 'epic', level: 80 },
{ name: 'Scope 8x', quality: 'legendary', level: 85 },
{ name: 'Level 2 Helmet', quality: 'rare', level: 75 }
]
},
{
name: 'RushMaster',
score: 7500,
equipments: [
{ name: 'Vector', quality: 'rare', level: 72 },
{ name: 'Level 2 Helmet', quality: 'common', level: 65 },
{ name: 'Quickdraw Mag', quality: 'common', level: 60 },
{ name: 'Laser Sight', quality: 'rare', level: 68 }
]
},
{
name: 'GhostWarrior',
score: 8200,
equipments: [
{ name: 'SCAR-L', quality: 'epic', level: 78 },
{ name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
{ name: 'Holographic Sight', quality: 'epic', level: 75 },
{ name: 'Suppressor', quality: 'rare', level: 72 },
{ name: 'Vertical Grip', quality: 'common', level: 65 }
]
},
{
name: 'DeathDealer',
score: 7300,
equipments: [
{ name: 'SKS', quality: 'epic', level: 76 },
{ name: 'Holographic Sight', quality: 'rare', level: 68 },
{ name: 'Extended Mag', quality: 'common', level: 65 }
]
},
{
name: 'StormRider',
score: 8900,
equipments: [
{ name: 'MK14', quality: 'legendary', level: 92 },
{ name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
{ name: 'Scope 8x', quality: 'epic', level: 80 },
{ name: 'Suppressor', quality: 'legendary', level: 88 },
{ name: 'Tactical Stock', quality: 'rare', level: 75 }
]
},
{
name: 'CombatLegend',
score: 7600,
equipments: [
{ name: 'UMP45', quality: 'rare', level: 74 },
{ name: 'Level 2 Vest', quality: 'common', level: 67 },
{ name: 'Red Dot Sight', quality: 'common', level: 62 },
{ name: 'Extended Mag', quality: 'rare', level: 70 }
]
}
];

// Create a TreeMultiMap for player rankings
const playerRankings = new TreeMultiMap<number, Equipment, Player>(players, {
toEntryFn: ({ score, equipments }) => [score, equipments],
isMapMode: false
});

const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node.key));
console.log(topPlayersEquipments); // [
// [
// {
// name: 'MK14',
// quality: 'legendary',
// level: 92
// },
// { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
// {
// name: 'Scope 8x',
// quality: 'epic',
// level: 80
// },
// { name: 'Suppressor', quality: 'legendary', level: 88 },
// {
// name: 'Tactical Stock',
// quality: 'rare',
// level: 75
// }
// ],
// [
// { name: 'KAR98K', quality: 'legendary', level: 90 },
// {
// name: 'Level 3 Vest',
// quality: 'legendary',
// level: 85
// },
// { name: 'Holographic Sight', quality: 'epic', level: 82 },
// {
// name: 'Suppressor',
// quality: 'legendary',
// level: 88
// },
// { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
// ]
// ];

Type Parameters

  • K = any
  • V = any
  • R = any

Implements

  • Iterable<[K, V[]]>

Constructors

  • Creates a new TreeMultiMap.

    Type Parameters

    • K = any
    • V = any
    • R = any

    Parameters

    • keysNodesEntriesOrRaws: Iterable<
          | undefined
          | null
          | K
          | R
          | [undefined | null | K, undefined | V[]], any, any> = []

      Initial entries, or raw elements if toEntryFn is provided.

    • options: TreeMultiMapOptions<K, V[], R> = {}

      Configuration options including optional toEntryFn to transform raw elements.

    Returns TreeMultiMap<K, V, R>

    Time O(m log m), Space O(m) where m is the number of initial entries

    // Standard usage with entries
    const mmap = new TreeMultiMap([['a', ['x', 'y']], ['b', ['z']]]);

    // Using toEntryFn to transform raw objects
    const players = [{ score: 100, items: ['sword'] }, { score: 200, items: ['shield', 'bow'] }];
    const mmap = new TreeMultiMap(players, { toEntryFn: p => [p.score, p.items] });

Accessors

Methods

  • Returns the entry with the smallest key >= given key.

    Parameters

    • key: K

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
    map.ceiling(15); // [20, ['b']]
    map.ceiling(20); // [20, ['b']]
  • Delete a single occurrence of a value from a key's bucket.

    Parameters

    • key: K
    • value: V
    • eq: ((a: V, b: V) => boolean) = Object.is
        • (a, b): boolean
        • Parameters

          Returns boolean

    Returns boolean

    Time O(log n + m), Space O(1) where m is bucket size

  • Delete all occurrences of a value from a key's bucket.

    Parameters

    • key: K
    • value: V
    • eq: ((a: V, b: V) => boolean) = Object.is
        • (a, b): boolean
        • Parameters

          Returns boolean

    Returns number

    Time O(log n + m), Space O(1) where m is bucket size

  • Returns the entry with the smallest key.

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
    map.first(); // [1, ['a']]
  • Returns the entry with the largest key <= given key.

    Parameters

    • key: K

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
    map.floor(25); // [20, ['b']]
    map.floor(20); // [20, ['b']]
  • Executes a callback for each entry.

    Parameters

    • callback: ((value: V[], key: K, map: this) => void)
        • (value, key, map): void
        • Parameters

          • value: V[]
          • key: K
          • map: this

          Returns void

    Returns void

    Time O(n), Space O(1)

  • Check if a specific value exists in a key's bucket.

    Parameters

    • key: K
    • value: V
    • eq: ((a: V, b: V) => boolean) = Object.is
        • (a, b): boolean
        • Parameters

          Returns boolean

    Returns boolean

    Time O(log n + m), Space O(1) where m is bucket size

  • Returns the entry with the smallest key > given key.

    Parameters

    • key: K

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
    map.higher(10); // [20, ['b']]
    map.higher(15); // [20, ['b']]
  • Returns the entry with the largest key.

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
    map.last(); // [2, ['b']]
  • Returns the entry with the largest key < given key.

    Parameters

    • key: K

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
    map.lower(20); // [10, ['a']]
    map.lower(15); // [10, ['a']]
  • Removes and returns the entry with the smallest key.

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
    map.pollFirst(); // [1, ['a']]
    map.has(1); // false
  • Removes and returns the entry with the largest key.

    Returns undefined | [K, V[]]

    Time O(log n), Space O(1)

    const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
    map.pollLast(); // [2, ['b']]
    map.has(2); // false
  • Reduces all entries to a single value.

    Type Parameters

    • U

    Parameters

    • callback: ((accumulator: U, value: V[], key: K, map: this) => U)
        • (accumulator, value, key, map): U
        • Parameters

          • accumulator: U
          • value: V[]
          • key: K
          • map: this

          Returns U

    • initialValue: U

    Returns U

    Time O(n), Space O(1)

  • Alias for compatibility with existing TreeMultiMap semantics.

    Parameters

    • entry:
          | undefined
          | null
          | K
          | [undefined | null | K, undefined | V[]]
    • Optionalvalue: V

    Returns boolean

    Time O(log n), Space O(1) for single value; O(log n + m) for bucket append

  • Sets multiple entries at once.

    Parameters

    • keysNodesEntriesOrRaws: Iterable<K | [undefined | null | K, undefined | V[]], any, any>

    Returns boolean[]

    Time O(m log n), Space O(m) where m is input size