@@ -24,9 +24,8 @@ type ConcurrentStack<'T>() =
2424 ( xs.GetEnumerator() :> System.Collections.IEnumerator)
2525
2626// not thread safe, just a Dictionary // TODO: threaded implementation
27- [<AllowNullLiteral>]
2827type ConcurrentDictionary < 'K , 'V >( comparer : IEqualityComparer < 'K >) =
29- inherit Dictionary< 'K, 'V>( comparer)
28+ let xs = Dictionary< 'K, 'V>( comparer)
3029
3130 new () =
3231 ConcurrentDictionary< 'K, 'V>( EqualityComparer.Default)
@@ -37,47 +36,127 @@ type ConcurrentDictionary<'K, 'V>(comparer: IEqualityComparer<'K>) =
3736 new ( _concurrencyLevel : int , _capacity : int , comparer : IEqualityComparer < 'K >) =
3837 ConcurrentDictionary< 'K, 'V>( comparer)
3938
40- member x.TryAdd ( key : 'K , value : 'V ): bool =
41- if x.ContainsKey( key)
39+ member _.Keys = xs.Keys
40+ member _.Values = xs.Values
41+
42+ member _.Item
43+ with get ( key : 'K ): 'V = xs[ key]
44+ and set ( key : 'K ) ( value : 'V ) = xs[ key] <- value
45+
46+ member _.Clear () = xs.Clear()
47+ member _.ContainsKey ( key : 'K ) = xs.ContainsKey( key)
48+
49+ member _.TryGetValue ( key : 'K ): bool * 'V =
50+ match xs.TryGetValue( key) with
51+ | true , v -> ( true , v)
52+ | false , v -> ( false , v)
53+
54+ member _.TryAdd ( key : 'K , value : 'V ): bool =
55+ if xs.ContainsKey( key)
4256 then false
43- else x .Add( key, value); true
57+ else xs .Add( key, value); true
4458
45- member x .TryRemove ( key : 'K ): bool * 'V =
46- match x .TryGetValue( key) with
47- | true , v -> ( x .Remove( key), v)
59+ member _ .TryRemove ( key : 'K ): bool * 'V =
60+ match xs .TryGetValue( key) with
61+ | true , v -> ( xs .Remove( key), v)
4862 | _ as res -> res
4963
50- member x .GetOrAdd ( key : 'K , value : 'V ): 'V =
51- match x .TryGetValue( key) with
64+ member _ .GetOrAdd ( key : 'K , value : 'V ): 'V =
65+ match xs .TryGetValue( key) with
5266 | true , v -> v
53- | _ -> let v = value in x .Add( key, v); v
67+ | _ -> let v = value in xs .Add( key, v); v
5468
55- member x .GetOrAdd ( key : 'K , valueFactory : System.Func < 'K , 'V >): 'V =
56- match x .TryGetValue( key) with
69+ member _ .GetOrAdd ( key : 'K , valueFactory : System.Func < 'K , 'V >): 'V =
70+ match xs .TryGetValue( key) with
5771 | true , v -> v
58- | _ -> let v = valueFactory.Invoke( key) in x .Add( key, v); v
72+ | _ -> let v = valueFactory.Invoke( key) in xs .Add( key, v); v
5973
60- // member x .GetOrAdd<'Arg> (key: 'K, valueFactory: 'K * 'Arg -> 'V, arg: 'Arg): 'V =
61- // match x .TryGetValue(key) with
74+ // member _ .GetOrAdd<'Arg> (key: 'K, valueFactory: 'K * 'Arg -> 'V, arg: 'Arg): 'V =
75+ // match xs .TryGetValue(key) with
6276 // | true, v -> v
63- // | _ -> let v = valueFactory(key, arg) in x .Add(key, v); v
77+ // | _ -> let v = valueFactory(key, arg) in xs .Add(key, v); v
6478
65- member x .TryUpdate ( key : 'K , value : 'V , comparisonValue : 'V ): bool =
66- match x .TryGetValue( key) with
67- | true , v when Unchecked.equals v comparisonValue -> x [ key] <- value; true
79+ member _ .TryUpdate ( key : 'K , value : 'V , comparisonValue : 'V ): bool =
80+ match xs .TryGetValue( key) with
81+ | true , v when Unchecked.equals v comparisonValue -> xs [ key] <- value; true
6882 | _ -> false
6983
70- member x.AddOrUpdate ( key : 'K , value : 'V , updateFactory : System.Func < 'K , 'V , 'V >): 'V =
71- match x.TryGetValue( key) with
72- | true , v -> let v = updateFactory.Invoke( key, v) in x[ key] <- v; v
73- | _ -> let v = value in x.Add( key, v); v
84+ member _.AddOrUpdate ( key : 'K , value : 'V , updateFactory : System.Func < 'K , 'V , 'V >): 'V =
85+ match xs.TryGetValue( key) with
86+ | true , v -> let v = updateFactory.Invoke( key, v) in xs[ key] <- v; v
87+ | _ -> let v = value in xs.Add( key, v); v
88+
89+ // member _.AddOrUpdate (key: 'K, valueFactory: 'K -> 'V, updateFactory: 'K * 'V -> 'V): 'V =
90+ // match xs.TryGetValue(key) with
91+ // | true, v -> let v = updateFactory(key, v) in xs[key] <- v; v
92+ // | _ -> let v = valueFactory(key) in xs.Add(key, v); v
93+
94+ // member _.AddOrUpdate (key: 'K, valueFactory: 'K * 'Arg -> 'V, updateFactory: 'K * 'Arg * 'V -> 'V, arg: 'Arg): 'V =
95+ // match xs.TryGetValue(key) with
96+ // | true, v -> let v = updateFactory(key, arg, v) in xs[key] <- v; v
97+ // | _ -> let v = valueFactory(key, arg) in xs.Add(key, v); v
98+
99+ interface System.Collections.IEnumerable with
100+ member _.GetEnumerator (): System.Collections.IEnumerator =
101+ ( xs.GetEnumerator() :> System.Collections.IEnumerator)
102+
103+ interface IEnumerable< KeyValuePair< 'K, 'V>> with
104+ member _.GetEnumerator (): IEnumerator < KeyValuePair < 'K , 'V >> =
105+ xs.GetEnumerator()
106+
107+ interface ICollection< KeyValuePair< 'K, 'V>> with
108+ member _.Add ( item : KeyValuePair < 'K , 'V >) : unit =
109+ xs.Add( item.Key, item.Value)
110+
111+ member _.Clear () : unit = xs.Clear()
112+
113+ member _.Contains ( item : KeyValuePair < 'K , 'V >) : bool =
114+ match xs.TryGetValue( item.Key) with
115+ | true , value when Unchecked.equals value item.Value -> true
116+ | _ -> false
117+
118+ member _.CopyTo ( array : KeyValuePair < 'K , 'V >[], arrayIndex : int ) : unit =
119+ xs |> Seq.iteri ( fun i e -> array[ arrayIndex + i] <- e)
120+
121+ member _.Count : int = xs.Count
122+ member _.IsReadOnly : bool = false
123+
124+ member _.Remove ( item : KeyValuePair < 'K , 'V >) : bool =
125+ match xs.TryGetValue( item.Key) with
126+ | true , value when Unchecked.equals value item.Value -> xs.Remove( item.Key)
127+ | _ -> false
128+
129+ interface IDictionary< 'K, 'V> with
130+ member _.Add ( key : 'K , value : 'V ) : unit = xs.Add( key, value)
131+ member _.ContainsKey ( key : 'K ) : bool = xs.ContainsKey( key)
132+
133+ member _.Item
134+ with get ( key : 'K ): 'V = xs[ key]
135+ and set ( key : 'K ) ( v : 'V ): unit = xs[ key] <- v
136+
137+ member _.Keys : ICollection < 'K > = xs.Keys
138+
139+ member _.Remove ( key : 'K ) : bool = xs.Remove( key)
140+
141+ member _.TryGetValue ( key : 'K , value : byref < 'V >) : bool = xs.TryGetValue( key, & value)
142+ member _.Values : ICollection < 'V > = xs.Values
143+
144+ interface Fable.Core.JS.Map< 'K, 'V> with
145+ member _.size = xs.Count
146+ member _.clear () = xs.Clear()
147+ member _.delete ( k ) = xs.Remove( k)
148+
149+ member _.entries () =
150+ xs |> Seq.map ( fun p -> p.Key, p.Value)
151+
152+ member _.get ( k ) = xs[ k]
153+ member _.has ( k ) = xs.ContainsKey( k)
154+ member _.keys () = xs.Keys
155+ member _.values () = xs.Values
74156
75- // member x.AddOrUpdate (key: 'K, valueFactory: 'K -> 'V, updateFactory: 'K * 'V -> 'V): 'V =
76- // match x.TryGetValue(key) with
77- // | true, v -> let v = updateFactory(key, v) in x[key] <- v; v
78- // | _ -> let v = valueFactory(key) in x.Add(key, v); v
157+ member this.set ( k , v ) =
158+ xs[ k] <- v
159+ this
79160
80- // member x.AddOrUpdate (key: 'K, valueFactory: 'K * 'Arg -> 'V, updateFactory: 'K * 'Arg * 'V -> 'V, arg: 'Arg): 'V =
81- // match x.TryGetValue(key) with
82- // | true, v -> let v = updateFactory(key, arg, v) in x[key] <- v; v
83- // | _ -> let v = valueFactory(key, arg) in x.Add(key, v); v
161+ member this.forEach ( f , ? thisArg ) =
162+ this |> Seq.iter ( fun p -> f p.Value p.Key this)
0 commit comments