Skip to content

Commit

Permalink
Showing 4 changed files with 60 additions and 27 deletions.
17 changes: 11 additions & 6 deletions LanguageExt.Core/Monads/Alternative Value Monads/Fin/Fin.Fail.cs
Original file line number Diff line number Diff line change
@@ -6,8 +6,13 @@ namespace LanguageExt;

public partial class Fin
{
public sealed record Fail<A>(Error Error) : Fin<A>
public sealed class Fail<A>(Error Error) : Fin<A>
{
/// <summary>
/// Value accessor
/// </summary>
public Error Error { get; } = Error;

/// <summary>
/// Is the structure in a Success state?
/// </summary>
@@ -40,12 +45,9 @@ public override B Match<B>(Func<A, B> Succ, Func<Error, B> Fail) =>
public override string ToString() =>
$"Succ({Error})";

/// <summary>
/// Get a hash code for the structure
/// </summary>
[Pure]
public override int GetHashCode() =>
Error.GetHashCode();
public override int GetHashCode<HashA>() =>
-1;

/// <summary>
/// Empty span
@@ -125,5 +127,8 @@ public override Fin<B> BiBind<B>(
Func<A, Fin<B>> Succ,
Func<Error, Fin<B>> Fail) =>
Fail(Error);

public void Deconstruct(out Error value) =>
value = Error;
}
}
18 changes: 12 additions & 6 deletions LanguageExt.Core/Monads/Alternative Value Monads/Fin/Fin.Succ.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
using System;
using System.Diagnostics.Contracts;
using LanguageExt.ClassInstances;
using LanguageExt.Common;

namespace LanguageExt;

public partial class Fin
{
public sealed record Succ<A>(A Value) : Fin<A>
public sealed class Succ<A>(A Value) : Fin<A>
{
/// <summary>
/// Value accessor
/// </summary>
public A Value { get; } = Value;

/// <summary>
/// Is the structure in a Success state?
/// </summary>
@@ -44,9 +48,8 @@ public override string ToString() =>
/// <summary>
/// Get a hash code for the structure
/// </summary>
[Pure]
public override int GetHashCode() =>
Value is null ? 0 : HashableDefault<A>.GetHashCode(Value);
public override int GetHashCode<HashA>() =>
Value is null ? 0 : HashA.GetHashCode(Value);

/// <summary>
/// Empty span
@@ -66,7 +69,7 @@ public override ReadOnlySpan<A> SuccSpan() =>
/// Compare this structure to another to find its relative ordering
/// </summary>
[Pure]
public override int CompareTo<OrdA>(Fin<A> other) =>
public override int CompareTo<OrdA>(Fin<A>? other) =>
other switch
{
Succ<A> r => OrdA.Compare(Value, r.Value),
@@ -132,5 +135,8 @@ public override Fin<B> BiBind<B>(
Func<A, Fin<B>> Succ,
Func<Error, Fin<B>> Fail) =>
Succ(Value);

public void Deconstruct(out A value) =>
value = Value;
}
}
50 changes: 36 additions & 14 deletions LanguageExt.Core/Monads/Alternative Value Monads/Fin/Fin.cs
Original file line number Diff line number Diff line change
@@ -14,9 +14,10 @@ namespace LanguageExt;
/// Equivalent of `Either<Error, A>`
/// Called `Fin` because it is expected to be used as the concrete result of a computation
/// </summary>
public abstract record Fin<A> :
public abstract class Fin<A> :
IEnumerable<A>,
IComparable<Fin<A>>,
IEquatable<Fin<A>>,
IComparable,
K<Fin, A>
{
@@ -78,7 +79,29 @@ public abstract int CompareTo<OrdA>(Fin<A> other)
/// </summary>
[Pure]
public abstract bool Equals<EqA>(Fin<A> other)
where EqA : Eq<A>;
where EqA : Eq<A>;

/// <summary>
/// Equality override
/// </summary>
[Pure]
public bool Equals(Fin<A>? other) =>
other is not null && Equals<EqDefault<A>>(other);

/// <summary>
/// Equality override
/// </summary>
[Pure]
public override bool Equals(object? other) =>
other is Fin<A> f && Equals(f);

[Pure]
public abstract int GetHashCode<HashA>()
where HashA : Hashable<A>;

[Pure]
public override int GetHashCode() =>
GetHashCode<HashableDefault<A>>();

/// <summary>
/// Unsafe access to the success value
@@ -127,17 +150,6 @@ public abstract bool Equals<EqA>(Fin<A> other)
public static Fin<A> Empty { get; } =
new Fin.Fail<A>(Errors.None);

/// <summary>
/// Get hash code
/// </summary>
public override int GetHashCode() =>
this switch
{
Fin.Succ<A> s => s.GetHashCode(),
Fin.Fail<A> f => f.GetHashCode(),
_ => 0
};

[Pure, MethodImpl(Opt.Default)]
public static implicit operator Fin<A>(A value) =>
new Fin.Succ<A>(value);
@@ -183,6 +195,14 @@ public static bool operator true(Fin<A> ma) =>
public static bool operator false(Fin<A> ma) =>
ma.IsFail;

[Pure, MethodImpl(Opt.Default)]
public static bool operator ==(Fin<A> ma, Fin<A> mb) =>
ma.Equals(mb);

[Pure, MethodImpl(Opt.Default)]
public static bool operator !=(Fin<A> ma, Fin<A> mb) =>
!ma.Equals(mb);

/// <summary>
/// Comparison operator
/// </summary>
@@ -308,7 +328,7 @@ public static bool operator false(Fin<A> ma) =>
/// </summary>
[Pure]
public static bool operator ==(Fin<A> lhs, Error rhs) =>
lhs.Equals(rhs);
lhs.Equals((Fin<A>)rhs);

/// <summary>
/// Equality operator override
@@ -389,9 +409,11 @@ other is null
? 1
: CompareTo<OrdDefault<A>>(other);

/*
[Pure, MethodImpl(Opt.Default)]
public virtual bool Equals(Fin<A>? other) =>
other is not null && Equals<EqDefault<A>>(other);
*/

[Pure, MethodImpl(Opt.Default)]
public IEnumerator<A> GetEnumerator()
2 changes: 1 addition & 1 deletion LanguageExt.Tests/OptionTests.cs
Original file line number Diff line number Diff line change
@@ -186,8 +186,8 @@ public void OptionToFin()
var my = some.ToFin();
var me = none.ToFin(e);

var e1 = mx == my;
var e2 = mx.Equals(my);
var e1 = mx == my;
var e3 = mx.Equals((object)my);

Assert.True(e1);

0 comments on commit 006043c

Please sign in to comment.