LeetCode 706. Design HashMap in F#

URL

Design HashMap - LeetCode

Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/challenge/202310/design_hashmap/main.fsx

type MyHashMap =
    { Table: (int * int) list[] }

    static member private TableSize = 256

    static member private hash(key: int) : int = key % MyHashMap.TableSize

    static member init() : MyHashMap =
        { Table = Array.init MyHashMap.TableSize (fun _ -> [])}

    static member put (key: int) (value: int) (hash: MyHashMap) : MyHashMap =
        let rec put' lst key value =
            match lst with
            | [] -> [ (key, value) ]
            | (k, v) :: t ->
                if k = key then
                    (k, value) :: t
                else
                    (k, v) :: (put' t key value)

        let h = MyHashMap.hash key
        hash.Table.[h] <- put' hash.Table.[h] key value
        { Table = hash.Table }

    static member get (key: int) (hash: MyHashMap) : int =
        let h = MyHashMap.hash key

        match List.tryFind (fun (k, _) -> k = key) hash.Table.[h] with
        | None -> -1
        | Some((_, v)) -> v


    static member remove (key: int) (hash: MyHashMap) : MyHashMap =
        let rec remove' lst key =
            match lst with
            | [] -> []
            | (k, v) :: t -> if k = key then t else (k, v) :: (remove' t key)

        let h = MyHashMap.hash key
        hash.Table.[h] <- remove' hash.Table.[h] key
        { Table = hash.Table }