LeetCode 2349. Design a Number Container System in F#

URL

https://leetcode.com/problems/design-a-number-container-system/description/?envType=daily-question&envId=2025-02-08

Code

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

type NumberContainers =
    { numMap: Map<int, int>
      indexMap: Map<int, IPriorityQueue<int>> }

    static member empty =
        { numMap = Map.empty
          indexMap = Map.empty }

    static member change (index: int) (number: int) (nc: NumberContainers) : NumberContainers =
        let numMap = Map.add index number nc.numMap

        let q =
            Map.tryFind number nc.indexMap
            |> Option.defaultValue (PriorityQueue.empty false)
            |> PriorityQueue.insert index

        { numMap = numMap
          indexMap = Map.add number q nc.indexMap }

    static member find (number: int) (nc: NumberContainers) : int * NumberContainers =
        let rec f q =
            match PriorityQueue.tryPop q with
            | None ->
                -1,
                { nc with
                    indexMap = Map.add number q nc.indexMap }
            | Some((v, q')) ->
                if Map.find v nc.numMap = number then
                    v,
                    { nc with
                        indexMap = Map.add number q nc.indexMap }
                else
                    f q'

        match Map.tryFind number nc.indexMap with
        | None -> -1, nc
        | Some(q) -> f q