1
- using System ;
1
+ using System ;
2
2
3
3
using JetBrains . Annotations ;
4
4
5
5
namespace CodeJam
6
6
{
7
7
/// <summary>
8
- /// Represents a value type that can be assigned null.
8
+ /// Methods to work with <see cref="Option{T}"/>
9
9
/// </summary>
10
- /// <typeparam name="T"></typeparam>
11
10
[ PublicAPI ]
12
- public struct Option < T >
11
+ public static class Option
13
12
{
14
13
/// <summary>
15
- /// Initializes a new instance to the specified value.
14
+ /// Create instance of <see cref="Option{T}"/>
16
15
/// </summary>
17
- public Option ( T value )
16
+ /// <typeparam name="T">Type of value</typeparam>
17
+ /// <param name="value">Value</param>
18
+ /// <returns>New instance of <see cref="Option{T}"/>.</returns>
19
+ public static Option < T > Create < T > ( T value ) => new Option < T > ( value ) ;
20
+
21
+ /// <summary>
22
+ /// Calls <paramref name="someAction"/> if <paramref name="option"/> has value,
23
+ /// and <paramref name="noneAction"/> otherwise.
24
+ /// </summary>
25
+ public static void Match < T > (
26
+ this Option < T > option ,
27
+ [ NotNull , InstantHandle ] Action < Option < T > > someAction ,
28
+ [ NotNull , InstantHandle ] Action noneAction )
18
29
{
19
- HasValue = true ;
20
- Value = value ;
30
+ Code . NotNull ( someAction , nameof ( someAction ) ) ;
31
+ Code . NotNull ( noneAction , nameof ( noneAction ) ) ;
32
+
33
+ if ( option . HasValue )
34
+ someAction ( option ) ;
35
+ else
36
+ noneAction ( ) ;
21
37
}
22
38
23
39
/// <summary>
24
- /// Gets a value indicating whether the current object has a value.
40
+ /// Calls <paramref name="someFunc"/> if <paramref name="option"/> has value,
41
+ /// and <paramref name="noneFunc"/> otherwise.
25
42
/// </summary>
26
- public bool HasValue { get ; }
43
+ [ Pure ]
44
+ public static TResult Match < T , TResult > (
45
+ this Option < T > option ,
46
+ [ NotNull , InstantHandle ] Func < Option < T > , TResult > someFunc ,
47
+ [ NotNull , InstantHandle ] Func < TResult > noneFunc )
48
+ {
49
+ Code . NotNull ( someFunc , nameof ( someFunc ) ) ;
50
+ Code . NotNull ( noneFunc , nameof ( noneFunc ) ) ;
51
+
52
+ return option . HasValue ? someFunc ( option ) : noneFunc ( ) ;
53
+ }
27
54
28
55
/// <summary>
29
- /// Gets the value of the current object.
56
+ /// Returns value of <paramref name="option"/>, or <paramref name="defaultValue"/> if <paramref name="option"/>
57
+ /// hasn't it.
30
58
/// </summary>
31
- public T Value { get ; }
59
+ [ Pure ]
60
+ public static T GetValueOrDefault < T > ( this Option < T > option , T defaultValue = default ( T ) ) =>
61
+ option . HasValue ? option . Value : defaultValue ;
32
62
33
63
/// <summary>
34
- /// Creates a new object initialized to a specified value.
64
+ /// Converts <paramref name="option"/> value to another option with <paramref name="selectFunc"/>.
35
65
/// </summary>
36
- public static implicit operator Option < T > ( T value ) => new Option < T > ( value ) ;
66
+ [ Pure ]
67
+ public static Option < TResult > Map < T , TResult > (
68
+ this Option < T > option ,
69
+ [ InstantHandle ] Func < T , TResult > selectFunc )
70
+ {
71
+ Code . NotNull ( selectFunc , nameof ( selectFunc ) ) ;
72
+
73
+ return option . HasValue ? new Option < TResult > ( selectFunc ( option . Value ) ) : new Option < TResult > ( ) ;
74
+ }
37
75
}
38
76
}
0 commit comments