From 235281daf9a6d67874f7ab78219c4e6dd4eb12ef Mon Sep 17 00:00:00 2001 From: Matthew O'Connor Date: Fri, 25 Oct 2024 10:18:53 -0600 Subject: [PATCH] Implement ImmArray.Find and ImmSet.TryGetValue. Closes #2. --- Xledger.Collections.Test/TestImmArray.cs | 15 +++++++++++++++ Xledger.Collections.Test/TestImmSet.cs | 19 +++++++++++++++++++ Xledger.Collections/ImmArray.cs | 7 +++++++ Xledger.Collections/ImmSet.cs | 7 +++++++ 4 files changed, 48 insertions(+) diff --git a/Xledger.Collections.Test/TestImmArray.cs b/Xledger.Collections.Test/TestImmArray.cs index cfcf592..3b7f673 100644 --- a/Xledger.Collections.Test/TestImmArray.cs +++ b/Xledger.Collections.Test/TestImmArray.cs @@ -146,6 +146,21 @@ public void TestCompareToRecord() { Assert.ThrowsAny(() => imm2 >= imm1); } + [Fact] + public void TestFind() { + var arr = Enumerable.Range(-1, 100).ToArray(); + var imm = arr.ToImmArray(); + + Predicate pred = i => i == -1; + Assert.Equal(Array.Find(arr, pred), imm.Find(pred)); + pred = i => i == 12; + Assert.Equal(Array.Find(arr, pred), imm.Find(pred)); + pred = i => i == 75; + Assert.Equal(Array.Find(arr, pred), imm.Find(pred)); + pred = i => i == 1_000_000; + Assert.Equal(Array.Find(arr, pred), imm.Find(pred)); + } + public record Employee(int Id, string Name, decimal Salary); } diff --git a/Xledger.Collections.Test/TestImmSet.cs b/Xledger.Collections.Test/TestImmSet.cs index cd9462e..ced1dcc 100644 --- a/Xledger.Collections.Test/TestImmSet.cs +++ b/Xledger.Collections.Test/TestImmSet.cs @@ -79,6 +79,25 @@ public void TestContains() { Assert.True(lst.Contains(3)); } + [Fact] + public void TestTryGetValue() { + var imm = ImmSet.Of("foo", "bar", "baz"); + + var lookup = "food".Substring(0, 3); + var found = imm.TryGetValue(lookup, out var actual); + Assert.True(found); + Assert.NotSame(lookup, actual); + Assert.Equal(lookup, actual); + + found = imm.TryGetValue("foo", out actual); + Assert.True(found); + Assert.Same("foo", actual); + Assert.Equal("foo", actual); + + found = imm.TryGetValue("food", out actual); + Assert.False(found); + } + [Fact] public void TestNoOps() { var imm = ImmSet.Of(7, 6, 5, 4); diff --git a/Xledger.Collections/ImmArray.cs b/Xledger.Collections/ImmArray.cs index 9431b6a..d9caad4 100644 --- a/Xledger.Collections/ImmArray.cs +++ b/Xledger.Collections/ImmArray.cs @@ -121,6 +121,13 @@ public bool Contains(T item) { return this.data.Length > 0 && IndexOf(item) >= 0; } + /// + /// Returns the first matching element or default if none matches. + /// + public T Find(Predicate pred) { + return Array.Find(this.data, pred); + } + /// public int IndexOf(T item) { return Array.IndexOf(this.data, item); diff --git a/Xledger.Collections/ImmSet.cs b/Xledger.Collections/ImmSet.cs index 4495c77..b7dbb30 100644 --- a/Xledger.Collections/ImmSet.cs +++ b/Xledger.Collections/ImmSet.cs @@ -182,6 +182,13 @@ public bool SetEquals(IEnumerable other) { } } + /// + /// Searches the set for a given value and returns the equal value it finds, if any. + /// + public bool TryGetValue(T equalValue, out T actualValue) { + return this.data.TryGetValue(equalValue, out actualValue); + } + /// public override string ToString() { return $"[{string.Join(", ", this.data)}]";