Skip to content

Commit e4628d0

Browse files
committed
enhanced project file, full public api commented
1 parent 7bfd9f0 commit e4628d0

14 files changed

+996
-301
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public ResultOption<int, string> GetUserId(string username)
230230
none: ResultOption<int, string>.None);
231231

232232
// or, using the extension method
233-
LookupUserId(username).ToResultOption();
233+
// return LookupUserId(username).ToResultOption();
234234
}
235235
```
236236

src/Danom/Danom.csproj

+29
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4+
<AssemblyName>Danom</AssemblyName>
5+
<Version>1.0.0-alpha1</Version>
6+
7+
<!-- General info -->
8+
<Description>Monadic structures to simplify functional programming patterns in C#.</Description>
9+
<Copyright>Copyright 2024 Pim Brouwers</Copyright>
10+
<Authors>Pim Brouwers</Authors>
11+
<NeutralLanguage>en-CA</NeutralLanguage>
12+
13+
<!-- Build config -->
414
<TargetFramework>net8.0</TargetFramework>
515
<ImplicitUsings>enable</ImplicitUsings>
616
<Nullable>enable</Nullable>
17+
<DebugType>embedded</DebugType>
18+
<OutputType>Library</OutputType>
19+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
20+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
21+
22+
<!-- NuGet config -->
23+
<PackageId>Danom</PackageId>
24+
<PackageTags>fsharp;functional;database;sql;ado;adonet</PackageTags>
25+
<PackageProjectUrl>https://github.com/pimbrouwers/Danom</PackageProjectUrl>
26+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
27+
<PackageReadmeFile>README.md</PackageReadmeFile>
28+
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
29+
<RepositoryType>git</RepositoryType>
30+
<RepositoryUrl>https://github.com/pimbrouwers/Danom</RepositoryUrl>
31+
32+
<!-- SourceLink settings -->
33+
<PublishRepositoryUrl>true</PublishRepositoryUrl>
34+
<EmbedUntrackedSources>true</EmbedUntrackedSources>
35+
<IncludeSymbols>true</IncludeSymbols>
736
</PropertyGroup>
837

938
</Project>

src/Danom/Option/Option.cs

+32-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public Option<T> OrElseWith(
104104
/// <param name="value"></param>
105105
/// <returns></returns>
106106
public static Option<T> Some(T value) =>
107-
new Option<T>(value);
107+
new(value);
108108

109109
/// <summary>
110110
/// Creates Option with the specified value wrapped in a completed Task.
@@ -127,7 +127,7 @@ public static async Task<Option<T>> SomeAsync(Task<T> value) =>
127127
/// </summary>
128128
/// <returns></returns>
129129
public static Option<T> None() =>
130-
new Option<T>();
130+
new();
131131

132132
/// <summary>
133133
/// Creates a new Option with no value wrapped in a completed Task.
@@ -136,15 +136,37 @@ public static Option<T> None() =>
136136
public static Task<Option<T>> NoneAsync() =>
137137
Task.FromResult(None());
138138

139+
/// <summary>
140+
/// Returns true if the specified Options are equal.
141+
/// </summary>
142+
/// <param name="left"></param>
143+
/// <param name="right"></param>
144+
/// <returns></returns>
139145
public static bool operator ==(Option<T> left, Option<T> right) =>
140146
left.Equals(right);
141147

148+
/// <summary>
149+
/// Returns true if the specified Options are not equal.
150+
/// </summary>
151+
/// <param name="left"></param>
152+
/// <param name="right"></param>
153+
/// <returns></returns>
142154
public static bool operator !=(Option<T> left, Option<T> right) =>
143155
!(left == right);
144156

157+
/// <summary>
158+
/// Returns true if the specified Options are equal.
159+
/// </summary>
160+
/// <param name="obj"></param>
161+
/// <returns></returns>
145162
public override bool Equals(object? obj) =>
146163
obj is Option<T> o && Equals(o);
147164

165+
/// <summary>
166+
/// Returns true if the specified Options are equal.
167+
/// </summary>
168+
/// <param name="other"></param>
169+
/// <returns></returns>
148170
public readonly bool Equals(Option<T> other) =>
149171
Match(
150172
some: x1 =>
@@ -157,11 +179,19 @@ public readonly bool Equals(Option<T> other) =>
157179
none: () => true)
158180
);
159181

182+
/// <summary>
183+
/// Returns the hash code of the Option.
184+
/// </summary>
185+
/// <returns></returns>
160186
public override int GetHashCode() =>
161187
Match(
162188
some: x => x is null ? 0 : x.GetHashCode(),
163189
none: () => 0);
164190

191+
/// <summary>
192+
/// Returns the string representation of the Option.
193+
/// </summary>
194+
/// <returns></returns>
165195
public override string ToString() =>
166196
Match(
167197
some: x => $"Some({x})",

src/Danom/Result/Result.cs

+107-2
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public Result<U, TError> Map<U>(
7070
/// <summary>
7171
/// Evaluates the mapError delegate if Result is Error otherwise return Ok.
7272
/// </summary>
73-
/// <typeparam name="U"></typeparam>
74-
/// <param name="map"></param>
73+
/// <typeparam name="UError"></typeparam>
74+
/// <param name="mapError"></param>
7575
/// <returns></returns>
7676
public Result<T, UError> MapError<UError>(
7777
Func<TError, UError> mapError) =>
@@ -144,15 +144,37 @@ public static Task<Result<T, TError>> ErrorAsync(TError errors) =>
144144
public static async Task<Result<T, TError>> ErrorAsync(Task<TError> errors) =>
145145
Error(await errors);
146146

147+
/// <summary>
148+
/// Returns true if the specified Result is equal to the current Result.
149+
/// </summary>
150+
/// <param name="left"></param>
151+
/// <param name="right"></param>
152+
/// <returns></returns>
147153
public static bool operator ==(Result<T, TError> left, Result<T, TError> right) =>
148154
left.Equals(right);
149155

156+
/// <summary>
157+
/// Returns true if the specified Result is not equal to the current Result.
158+
/// </summary>
159+
/// <param name="left"></param>
160+
/// <param name="right"></param>
161+
/// <returns></returns>
150162
public static bool operator !=(Result<T, TError> left, Result<T, TError> right) =>
151163
!(left == right);
152164

165+
/// <summary>
166+
/// Returns true if the specified Result is equal to the current Result.
167+
/// </summary>
168+
/// <param name="obj"></param>
169+
/// <returns></returns>
153170
public override bool Equals(object? obj) =>
154171
obj is Result<T, TError> o && Equals(o);
155172

173+
/// <summary>
174+
/// Returns true if the specified Result is equal to the current Result.
175+
/// </summary>
176+
/// <param name="other"></param>
177+
/// <returns></returns>
156178
public readonly bool Equals(Result<T, TError> other) =>
157179
Match(
158180
ok: x1 =>
@@ -164,13 +186,96 @@ public readonly bool Equals(Result<T, TError> other) =>
164186
ok: _ => false,
165187
error: e2 => e2 is not null && e2.Equals(e1)));
166188

189+
/// <summary>
190+
/// Returns the hash code for the Result.
191+
/// </summary>
192+
/// <returns></returns>
167193
public override int GetHashCode() =>
168194
Match(
169195
ok: x => x is null ? 0 : x.GetHashCode(),
170196
error: e => e is null ? 0 : e.GetHashCode());
171197

198+
/// <summary>
199+
/// Returns a string representation of the Result.
200+
/// </summary>
201+
/// <returns></returns>
172202
public override string ToString() =>
173203
Match(
174204
ok: x => $"Ok({x})",
175205
error: e => $"Error({e})");
176206
}
207+
208+
209+
/// <summary>
210+
/// The <see cref="Result{T, TError}"/> with <see cref="ResultErrors"/>
211+
/// as the predefined error type.
212+
///
213+
/// Alias for <see cref="Result{T, ResultErrors}"/>.
214+
/// </summary>
215+
/// <typeparam name="T"></typeparam>
216+
public static class Result<T>
217+
{
218+
/// <summary>
219+
/// Creates a new Result with the specified value.
220+
/// </summary>
221+
/// <param name="value"></param>
222+
/// <returns></returns>
223+
public static Result<T, ResultErrors> Ok(T value) =>
224+
Result<T, ResultErrors>.Ok(value);
225+
226+
/// <summary>
227+
/// Creates Result with the specified value wrapped in a completed Task.
228+
/// </summary>
229+
/// <param name="value"></param>
230+
/// <returns></returns>
231+
public static Task<Result<T, ResultErrors>> OkAsync(T value) =>
232+
Result<T, ResultErrors>.OkAsync(value);
233+
234+
/// <summary>
235+
/// Creates Result with the value of the awaited Task.
236+
/// </summary>
237+
/// <param name="valueTask"></param>
238+
/// <returns></returns>
239+
public static Task<Result<T, ResultErrors>> OkAsync(Task<T> valueTask) =>
240+
Result<T, ResultErrors>.OkAsync(valueTask);
241+
242+
/// <summary>
243+
/// Creates a new Result with the specified error.
244+
/// </summary>
245+
/// <param name="errors"></param>
246+
/// <returns></returns>
247+
public static Result<T, ResultErrors> Error(ResultErrors errors) =>
248+
Result<T, ResultErrors>.Error(errors);
249+
250+
/// <summary>
251+
/// Creates Result with the specified error wrapped in a completed Task.
252+
/// </summary>
253+
/// <param name="errors"></param>
254+
/// <returns></returns>
255+
public static Task<Result<T, ResultErrors>> ErrorAsync(ResultErrors errors) =>
256+
Task.FromResult(Error(errors));
257+
258+
/// <summary>
259+
/// Creates a new Result with the specified error.
260+
/// </summary>
261+
/// <param name="messages"></param>
262+
/// <returns></returns>
263+
public static Result<T, ResultErrors> Error(IEnumerable<string> messages) =>
264+
Error(new ResultErrors(messages));
265+
266+
/// <summary>
267+
/// Creates Result with the specified error wrapped in a completed Task.
268+
/// </summary>
269+
/// <param name="message"></param>
270+
/// <returns></returns>
271+
public static Result<T, ResultErrors> Error(string message) =>
272+
Error([message]);
273+
274+
/// <summary>
275+
/// Creates Result with the specified error wrapped in a completed Task.
276+
/// </summary>
277+
/// <param name="message"></param>
278+
/// <returns></returns>
279+
public static Task<Result<T, ResultErrors>> ErrorAsync(string message) =>
280+
Task.FromResult(Error(message));
281+
}

0 commit comments

Comments
 (0)