Skip to content

Commit 8b2bac3

Browse files
committed
+ tryItem fallback overload matching on exn
1 parent f614035 commit 8b2bac3

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

src/FSharpPlus/Control/Indexable.fs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ open FSharpPlus.Internals.MonadOps
1616

1717
type Item =
1818
inherit Default1
19+
20+
static member inline InvokeOnInstance (k: 'K) (x: '``Indexable<'T>``) : 'T = (^``Indexable<'T>`` : (member get_Item : _ -> 'T) x, k) : 'T
1921

20-
static member inline Item (x: '``Indexable<'T>`` , k , [<Optional>]_impl: Default1) = (^``Indexable<'T>`` : (member get_Item : _ -> 'T) x, k) : 'T
22+
static member inline Item (x: '``Indexable<'T>`` , k , [<Optional>]_impl: Default1) = Item.InvokeOnInstance k x : 'T
2123
static member inline Item (_: 'T when 'T: null and 'T: struct, _, _impl: Default1) = ()
2224

2325
static member Item (x: string , n , [<Optional>]_impl: Item ) = String.item n x
@@ -37,6 +39,12 @@ type Item =
3739

3840
type TryItem =
3941
inherit Default1
42+
43+
static member inline TryItem (x: '``Indexable<'T>``, k, [<Optional>]_impl: Default3) =
44+
try Some (Item.InvokeOnInstance k x) with
45+
| :? ArgumentException -> None
46+
| _ -> reraise ()
47+
4048
static member inline TryItem (x: '``Indexable<'T>``, k, [<Optional>]_impl: Default2) =
4149
let mutable r = Unchecked.defaultof< ^R>
4250
if (^``Indexable<'T>``: (member TryGetValue: _ * _ -> _) (x, k, &r)) then Some r else None

tests/FSharpPlus.Tests/Indexables.fs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,34 @@ open Helpers
1313

1414
module Indexables =
1515

16+
type NdXable1 = NdXable1 with static member TryItem (x, NdXable1) = if x = 1 then Some "Item retrieved" else None
17+
type NdXable3 = NdXable3 with member _.get_Item x = if x = 1 then "Item retrieved" else invalidArg "item" (string x)
18+
19+
[<Test>]
20+
let testTryItem () =
21+
let a1 = tryItem 0 NdXable1
22+
Assert.AreEqual (None, a1)
23+
let b1 = tryItem 1 NdXable1
24+
Assert.AreEqual (Some "Item retrieved", b1)
25+
26+
let dct = dict [1, "one"; 2, "two"]
27+
let a2 = tryItem 0 dct
28+
Assert.AreEqual (None, a2)
29+
let b2 = tryItem 1 dct
30+
Assert.AreEqual (Some "one", b2)
31+
32+
let a3 = tryItem 0 NdXable3
33+
Assert.AreEqual (None, a3)
34+
let b3 = tryItem 1 NdXable3
35+
Assert.AreEqual (Some "Item retrieved", b3)
36+
37+
let lst = ["zero"; "one"; "two"]
38+
let a4 = tryItem 10 lst
39+
Assert.AreEqual (None, a4)
40+
let b4 = tryItem 1 lst
41+
Assert.AreEqual (Some "one", b4)
42+
43+
1644
[<Test>]
1745
let testCompileAndExecuteItem () =
1846

@@ -53,6 +81,7 @@ module Indexables =
5381
// let f = seq [1, "one"; 2, "two"]
5482
// let _ = item 1 f
5583

84+
5685
()
5786

5887
[<Test>]

0 commit comments

Comments
 (0)