Skip to content

Commit b8e5e9c

Browse files
authored
Merge pull request #69 from fsprojects/compiled-names
HashSet/HashMap now use CompiledNames for C# interop
2 parents d64ef16 + 0c6a6d6 commit b8e5e9c

6 files changed

Lines changed: 77 additions & 30 deletions

File tree

src/CSharp.Data.Adaptive/HashMap.fs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ open System
44
open System.Runtime.CompilerServices
55
open FSharp.Data.Adaptive
66

7+
[<CompiledName("FSharpHashMapBuilder`2")>]
78
type HashMapBuilder<'Key, 'Value>() =
89
let mutable array : struct('Key * 'Value)[] = Array.zeroCreate 8
910
let mutable cnt = 0
@@ -16,33 +17,34 @@ type HashMapBuilder<'Key, 'Value>() =
1617
interface System.Collections.IEnumerable with
1718
member x.GetEnumerator() = (Seq.take cnt array).GetEnumerator() :> _
1819

20+
[<CompiledName("ToFSharpHashMap")>]
1921
member x.ToHashMap() =
2022
HashMap<'Key, 'Value>.OfArrayRangeV(array, 0, cnt)
2123

22-
[<AbstractClass; Sealed; Extension>]
24+
[<AbstractClass; Sealed; Extension; CompiledName("FSharpHashMap")>]
2325
type HashMap private() =
2426
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
2527
static member Empty<'K, 'V>() = HashMap.empty<'K, 'V>
2628

2729
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
2830
static member Single<'K, 'V>(k : 'K, v : 'V) = HashMap.single k v
2931

30-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
32+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashMap")>]
3133
static member ToHashMap(this: seq<'K * 'V>) = HashMap.ofSeq this
3234

33-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
35+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashMap")>]
3436
static member ToHashMap(this: list<'K * 'V>) = HashMap.ofList this
3537

36-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
38+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashMap")>]
3739
static member ToHashMap(this: ('K * 'V)[]) = HashMap.ofArray this
3840

39-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
41+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashMap")>]
4042
static member ToHashMap(this: seq<struct ('K * 'V)>) = HashMap.OfSeqV this
4143

42-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
44+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashMap")>]
4345
static member ToHashMap(this: list<struct ('K * 'V)>) = HashMap.OfSeqV this
4446

45-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
47+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashMap")>]
4648
static member ToHashMap(this: struct('K * 'V)[]) = HashMap.OfSeqV this
4749

4850
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]

src/CSharp.Data.Adaptive/HashSet.fs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ open System
44
open System.Runtime.CompilerServices
55
open FSharp.Data.Adaptive
66

7+
[<CompiledName("FSharpHashSetBuilder`1")>]
78
type HashSetBuilder<'T>() =
89
let mutable array : 'T[] = Array.zeroCreate 8
910
let mutable cnt = 0
@@ -16,10 +17,11 @@ type HashSetBuilder<'T>() =
1617
interface System.Collections.IEnumerable with
1718
member x.GetEnumerator() = (Seq.take cnt array).GetEnumerator() :> _
1819

20+
[<CompiledName("ToFSharpHashSet")>]
1921
member x.ToHashSet() =
2022
HashSet<'T>.OfArrayRange(array, 0, cnt)
2123

22-
[<AbstractClass; Sealed; Extension>]
24+
[<AbstractClass; Sealed; Extension; CompiledName("FSharpHashSet")>]
2325
type HashSet private() =
2426

2527
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
@@ -32,13 +34,13 @@ type HashSet private() =
3234
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
3335
static member Single<'T>(value: 'T) = HashSet.single value
3436

35-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
37+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashSet")>]
3638
static member ToHashSet(elements: seq<'T>) = HashSet.ofSeq elements
3739

38-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
40+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashSet")>]
3941
static member ToHashSet(elements: list<'T>) = HashSet.ofList elements
4042

41-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
43+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashSet")>]
4244
static member ToHashSet(elements: 'T[]) = HashSet.ofArray elements
4345

4446
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
@@ -111,7 +113,7 @@ type HashSet private() =
111113
let (a,b) = HashSet.applyDelta set delta
112114
struct(a,b)
113115

114-
[<AbstractClass; Sealed; Extension>]
116+
[<AbstractClass; Sealed; Extension; CompiledName("FSharpHashSetDelta")>]
115117
type HashSetDelta private() =
116118

117119
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
@@ -124,13 +126,13 @@ type HashSetDelta private() =
124126
[<MethodImpl(MethodImplOptions.AggressiveInlining)>]
125127
static member Single<'T>(value: SetOperation<'T>) = HashSetDelta.single value
126128

127-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
129+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashSetDelta")>]
128130
static member ToHashSetDelta(elements: seq<SetOperation<'T>>) = HashSetDelta.ofSeq elements
129131

130-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
132+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashSetDelta")>]
131133
static member ToHashSetDelta(elements: list<SetOperation<'T>>) = HashSetDelta.ofList elements
132134

133-
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]
135+
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining); CompiledName("ToFSharpHashSetDelta")>]
134136
static member ToHashSetDelta(elements: SetOperation<'T>[]) = HashSetDelta.ofArray elements
135137

136138
[<Extension; MethodImpl(MethodImplOptions.AggressiveInlining)>]

src/Demo/CSharpInterop/Program.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,35 @@ public static void Main()
1414
{
1515
DefaultEqualityComparer.SetProvider(DefaultEqualityComparer.System);
1616

17+
var testSet = new FSharpHashSet<int>(new [] { 1, 2, 3, 4 });
18+
1719
var mappy =
18-
new HashMapBuilder<int, int> { { 1, 3 }, { 2, 4 } }
19-
.ToHashMap()
20+
new FSharpHashMapBuilder<int, int> { { 1, 3 }, { 2, 4 } }
21+
.ToFSharpHashMap()
2022
.Add(4, 5)
2123
.Remove(2)
2224
.Alter(1, (int? o) => o)
2325
.Alter(1, (Microsoft.FSharp.Core.FSharpOption<int> o) => o)
2426
.Alter(1, o => o)
2527
.Map((k, v) => v * 3);
2628

27-
var delta123123 = mappy.ComputeDeltaTo(HashMap.Empty<int, int>());
29+
var delta123123 = mappy.ComputeDeltaTo(FSharpHashMap.Empty<int, int>());
2830

2931
var (sm, dm) = mappy.ApplyDelta(delta123123);
3032

31-
var smasdasd = HashMap.Empty<int, int>().ApplyDelta(ref delta123123);
33+
var smasdasd = FSharpHashMap.Empty<int, int>().ApplyDelta(ref delta123123);
3234

33-
var test =
35+
FSharpHashSet<int> test =
3436
new[] { 1, 2, 3, 4, 5 }
35-
.ToHashSet()
37+
.ToFSharpHashSet()
3638
.Map(i => i * 2)
3739
.Filter(i => i % 2 == 0)
38-
.Collect(i => HashSet.Single(i))
39-
.Subtract(HashSet.Single(2))
40+
.Collect(i => FSharpHashSet.Single(i))
41+
.Subtract(FSharpHashSet.Single(2))
4042
.Alter(2, i => !i)
4143
.MapNullable(i => i < 10 ? (int?)i : null);
4244

43-
var delta = test.ComputeDeltaTo(HashSet.Empty<int>()).Add(SetOperation<int>.Add(2131));
45+
var delta = test.ComputeDeltaTo(FSharpHashSet.Empty<int>()).Add(SetOperation<int>.Add(2131));
4446
var sepp1 = test.ApplyDelta(ref delta);
4547
var (newState, realDelta) = test.ApplyDelta(delta);
4648

@@ -66,7 +68,7 @@ public static void Main()
6668
Console.WriteLine("{0}", dependent.GetValue());
6769
using (Adaptive.Transact)
6870
{
69-
changeableSet.Value = new HashSetBuilder<int>() { 5, 6, 7, 8, 9, 0 }.ToHashSet();
71+
changeableSet.Value = new FSharpHashSetBuilder<int>() { 5, 6, 7, 8, 9, 0 }.ToFSharpHashSet();
7072
changeableMap.Value = HashMapModule.empty<int, int>();
7173
changeableList.Value = IndexListModule.empty<int>();
7274
changeableList.Add(1);

src/FSharp.Data.Adaptive/Datastructures/HashCollections.fs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3357,14 +3357,15 @@ module internal HashMapImplementation =
33573357

33583358

33593359

3360-
[<Struct; CustomEquality; NoComparison; StructuredFormatDisplay("{AsString}")>]
3360+
[<Struct; CustomEquality; NoComparison; StructuredFormatDisplay("{AsString}"); CompiledName("FSharpHashSet`1")>]
33613361
type HashSet<'T> internal(cmp: IEqualityComparer<'T>, root: HashSetNode<'T>) =
33623362

33633363
static member Empty = HashSet<'T>(DefaultEqualityComparer<'T>.Instance, HashSetEmpty.Instance)
33643364

33653365
member x.Count = root.Count
33663366
member x.IsEmpty = root.IsEmpty
33673367

3368+
member internal x.Comparer = cmp
33683369
member internal x.Root = root
33693370

33703371
member private x.AsString = x.ToString()
@@ -3584,6 +3585,18 @@ type HashSet<'T> internal(cmp: IEqualityComparer<'T>, root: HashSetNode<'T>) =
35843585
interface System.Collections.Generic.IEnumerable<'T> with
35853586
member x.GetEnumerator() = new HashSetEnumerator<_>(root) :> _
35863587

3588+
new(elements : seq<'T>) =
3589+
let o = HashSet.OfSeq elements
3590+
HashSet<'T>(o.Comparer, o.Root)
3591+
3592+
new(elements : HashSet<'T>) =
3593+
HashSet<'T>(elements.Comparer, elements.Root)
3594+
3595+
new(elements : 'T[]) =
3596+
let o = HashSet.OfArray elements
3597+
HashSet<'T>(o.Comparer, o.Root)
3598+
3599+
35873600
and internal HashSetEnumerator<'T>(root: HashSetNode<'T>) =
35883601
let mutable stack = [root]
35893602
let mutable linked: HashSetLinked<'T> = null
@@ -3636,14 +3649,15 @@ and internal HashSetEnumerator<'T>(root: HashSetNode<'T>) =
36363649
member x.Current = x.Current
36373650

36383651

3639-
[<Struct; CustomEquality; NoComparison; StructuredFormatDisplay("{AsString}")>]
3652+
[<Struct; CustomEquality; NoComparison; StructuredFormatDisplay("{AsString}"); CompiledName("FSharpHashMap`2")>]
36403653
type HashMap<'K, [<EqualityConditionalOn>] 'V> internal(cmp: IEqualityComparer<'K>, root: HashMapNode<'K, 'V>) =
36413654

36423655
static member Empty = HashMap<'K, 'V>(DefaultEqualityComparer<'K>.Instance, HashMapEmpty.Instance)
36433656

36443657
member x.Count = root.Count
36453658
member x.IsEmpty = root.IsEmpty
36463659

3660+
member internal x.Comparer = cmp
36473661
member internal x.Root : HashMapNode<'K, 'V> = root
36483662

36493663
member x.Item
@@ -3939,6 +3953,29 @@ type HashMap<'K, [<EqualityConditionalOn>] 'V> internal(cmp: IEqualityComparer<'
39393953

39403954
interface System.Collections.Generic.IEnumerable<'K * 'V> with
39413955
member x.GetEnumerator() = new HashMapEnumerator<_,_>(root) :> _
3956+
3957+
3958+
3959+
new(elements : seq<'K * 'V>) =
3960+
let o = HashMap.OfSeq elements
3961+
HashMap<'K, 'V>(o.Comparer, o.Root)
3962+
3963+
new(elements : HashMap<'K, 'V>) =
3964+
HashMap<'K, 'V>(elements.Comparer, elements.Root)
3965+
3966+
new(elements : array<'K * 'V>) =
3967+
let o = HashMap.OfArray elements
3968+
HashMap<'K, 'V>(o.Comparer, o.Root)
3969+
3970+
#if !FABLE_COMPILER
3971+
new(elements : seq<struct ('K * 'V)>) =
3972+
let o = HashMap.OfSeqV elements
3973+
HashMap<'K, 'V>(o.Comparer, o.Root)
3974+
3975+
new(elements : array<struct ('K * 'V)>) =
3976+
let o = HashMap.OfArrayV elements
3977+
HashMap<'K, 'V>(o.Comparer, o.Root)
3978+
#endif
39423979

39433980
and internal HashMapEnumerator<'K, 'V>(root: HashMapNode<'K, 'V>) =
39443981
let mutable stack = [root]
@@ -4042,7 +4079,9 @@ and internal HashMapStructEnumerator<'K, 'V>(root: HashMapNode<'K, 'V>) =
40424079
member x.Dispose() = x.Dispose()
40434080
member x.Current = x.Current
40444081

4082+
40454083
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
4084+
[<RequireQualifiedAccess>]
40464085
module HashSet =
40474086

40484087
/// The empty set.
@@ -4200,6 +4239,7 @@ module HashSet =
42004239
HashSet<'T>.ApplyDelta(l, r, apply)
42014240

42024241
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
4242+
[<RequireQualifiedAccess>]
42034243
module HashMap =
42044244

42054245
/// The empty map.

src/FSharp.Data.Adaptive/Datastructures/HashMapDelta.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ open FSharp.Data.Adaptive
66

77
/// Represents the difference of two HashMaps.
88
[<Struct; CustomEquality; NoComparison>]
9-
[<StructuredFormatDisplay("{AsString}")>]
9+
[<StructuredFormatDisplay("{AsString}"); CompiledName("FSharpHashMapDelta`2")>]
1010
type HashMapDelta<'K, [<EqualityConditionalOn>] 'V>(store : HashMap<'K, ElementOperation<'V>>) =
1111
static let empty = HashMapDelta<'K, 'V>(HashMap.empty)
1212

@@ -58,6 +58,7 @@ type HashMapDelta<'K, [<EqualityConditionalOn>] 'V>(store : HashMap<'K, ElementO
5858

5959

6060
/// Functional operators for HashMapDelta.
61+
[<CompiledName("FSharpHashMapDeltaModule")>]
6162
module HashMapDelta =
6263
/// The empty map delta.
6364
[<GeneralizableValue>]

src/FSharp.Data.Adaptive/Datastructures/HashSetDelta.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ open FSharp.Data.Adaptive
99
/// Internally uses reference counts to represent deltas and provides
1010
/// convenient combine functions.
1111
[<Struct; CustomEquality; NoComparison>]
12-
[<StructuredFormatDisplay("{AsString}")>]
12+
[<StructuredFormatDisplay("{AsString}"); CompiledName("FSharpHashSetDelta`1")>]
1313
type HashSetDelta<'T>(store: HashMap<'T, int>) =
1414

1515
/// The empty set.
@@ -202,7 +202,7 @@ and private DHashSetEnumerator<'T>(store: HashMap<'T, int>) =
202202
member x.Current = x.Current
203203

204204
/// Functional operators for HashSetDelta.
205-
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
205+
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix); CompiledName("FSharpHashSetDeltaModule")>]
206206
module HashSetDelta =
207207

208208
/// The empty set.

0 commit comments

Comments
 (0)