Skip to content

Commit d23503b

Browse files
committed
refactor(linq): FinTLinqExtensions Validation의 IO 전용 오버로드 제거
제네릭 M : Monad<M> 버전이 M=IO로 인스턴스화될 때 IO 전용 오버로드와 동일한 IL을 생성하므로 중복이다. 컴파일러 타입 추론에 위임하여 DRY 위반을 제거한다. - Validation → FinT<IO, _> SelectMany 제거 - FinT<IO, _> → Validation SelectMany 제거 - FinTLinqExtensions.cs 문서 테이블 및 설명 갱신
1 parent ca25d7d commit d23503b

2 files changed

Lines changed: 8 additions & 75 deletions

File tree

Src/Functorium/Applications/Linq/FinTLinqExtensions.Validation.cs

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -69,41 +69,6 @@ public static FinT<M, B> SelectMany<M, A, B>(
6969
return FinT.lift<M, A>(fin).Map(selector);
7070
}
7171

72-
// =========================================================================
73-
// Validation → FinT<IO, A> SelectMany (IO 모나드 특화)
74-
// =========================================================================
75-
76-
/// <summary>
77-
/// Validation → FinT&lt;IO, B&gt; 변환: IO 모나드에 특화된 SelectMany
78-
///
79-
/// LINQ 쿼리 표현식에서 Validation을 직접 사용 가능하게 함:
80-
/// from validated in LimitSampleIdentifier.Validate(...) // Validation&lt;Error, A&gt; → FinT&lt;IO, A&gt;
81-
/// from result in DoSomething(validated) // FinT&lt;IO, B&gt;
82-
/// select result
83-
///
84-
/// 사용 예:
85-
/// FinT&lt;IO, Unit&gt; usecase =
86-
/// from identifier in LimitSampleIdentifier.Validate(lineId, processId, partId, version)
87-
/// from saved in SaveToDatabase(identifier)
88-
/// select saved;
89-
///
90-
/// 장점:
91-
/// - AsFinT() 호출 불필요
92-
/// - 타입 추론 자동
93-
/// - LINQ 쿼리 표현식에서 자연스럽게 사용
94-
/// </summary>
95-
public static FinT<IO, C> SelectMany<A, B, C>(
96-
this Validation<Error, A> validation,
97-
Func<A, FinT<IO, B>> finTSelector,
98-
Func<A, B, C> projector)
99-
{
100-
Fin<A> fin = validation.Match(
101-
Succ: value => Fin.Succ(value),
102-
Fail: errors => Fin.Fail<A>(errors.Head));
103-
104-
return FinT.lift<IO, A>(fin).SelectMany(finTSelector, projector);
105-
}
106-
10772
// =========================================================================
10873
// FinT → Validation SelectMany (제네릭 모나드)
10974
// =========================================================================
@@ -151,33 +116,4 @@ public static FinT<M, C> SelectMany<M, A, B, C>(
151116
});
152117
}
153118

154-
/// <summary>
155-
/// FinT → Validation 체이닝 (IO 특화): IO 모나드에 특화된 SelectMany
156-
///
157-
/// LINQ 쿼리 표현식에서 타입 추론이 더 정확하게 동작:
158-
/// from finTVal in finTValue // FinT&lt;IO, A&gt;
159-
/// from validated in validationSelector(val) // Validation&lt;Error, B&gt;
160-
/// select result // C
161-
///
162-
/// 사용 예:
163-
/// FinT&lt;IO, Response&gt; usecase =
164-
/// from request in GetRequest() // FinT&lt;IO, Request&gt;
165-
/// from identifier in Identifier.Validate(request.Id) // Validation&lt;Error, Identifier&gt;
166-
/// from saved in repository.Save(identifier) // FinT&lt;IO, Entity&gt;
167-
/// select new Response(saved.Id);
168-
/// </summary>
169-
public static FinT<IO, C> SelectMany<A, B, C>(
170-
this FinT<IO, A> finT,
171-
Func<A, Validation<Error, B>> validationSelector,
172-
Func<A, B, C> projector)
173-
{
174-
return finT.Bind(a =>
175-
{
176-
Fin<B> fin = validationSelector(a).Match(
177-
Succ: value => Fin.Succ(value),
178-
Fail: errors => Fin.Fail<B>(errors.Head));
179-
180-
return FinT.lift<IO, B>(fin).Map(b => projector(a, b));
181-
});
182-
}
183119
}

Src/Functorium/Applications/Linq/FinTLinqExtensions.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ namespace Functorium.Applications.Linq;
1919
// | .IO.cs | FinT<IO, A> | IO<B> | FinT<IO, C> | FinT 체인 중간에 IO 사용 |
2020
// | .Validation.cs | Validation<Error, A> | FinT<M, B> | FinT<M, C> | Validation → FinT (제네릭) |
2121
// | .Validation.cs | Validation<Error, A> | B (Map) | FinT<M, B> | Validation → FinT 단순 변환 |
22-
// | .Validation.cs | Validation<Error, A> | FinT<IO, B> | FinT<IO, C> | Validation → FinT (IO 특화) |
2322
// | .Validation.cs | FinT<M, A> | Validation<Error, B> | FinT<M, C> | FinT 체인 중간에 Validation 사용 |
24-
// | .Validation.cs | FinT<IO, A> | Validation<Error, B> | FinT<IO, C> | FinT 체인 중간에 Validation (IO) |
2523
//
2624
// -----------------------------------------------------------------------------
2725
// Filter 확장 메서드 (조건부 필터링)
@@ -45,23 +43,22 @@ namespace Functorium.Applications.Linq;
4543
// IO.cs와 Validation.cs의 메서드 수가 다른 이유
4644
// -----------------------------------------------------------------------------
4745
//
48-
// IO.cs (3개) vs Validation.cs (5개)
46+
// IO.cs (3개) vs Validation.cs (3개)
4947
//
50-
// | Direction | IO.cs | Validation.cs |
51-
// |------------------------|----------|----------------|
52-
// | Source -> FinT (Map) | IO only | Generic M |
53-
// | Source -> FinT<M, B> | IO only | Generic M + IO |
54-
// | FinT<M, A> -> Source | IO only | Generic M + IO |
48+
// | Direction | IO.cs | Validation.cs |
49+
// |------------------------|-----------|---------------|
50+
// | Source -> FinT (Map) | IO only | Generic M |
51+
// | Source -> FinT<M, B> | IO only | Generic M |
52+
// | FinT<M, A> -> Source | IO only | Generic M |
5553
//
5654
// 이유:
5755
// - IO는 그 자체가 특정 모나드이므로 제네릭 M 버전이 불필요합니다.
5856
// IO<A>는 이미 IO 모나드에 종속되어 있습니다.
5957
// FinT<M, A> → IO<B>는 M이 IO일 때만 의미가 있습니다.
6058
//
6159
// - Validation은 모나드가 아닌 데이터 타입이므로 어떤 모나드 M과도 조합 가능합니다.
62-
// FinT<IO, A> → Validation 가능
63-
// FinT<Task, A> → Validation 가능 (이론상)
64-
// 따라서 제네릭 M 버전과 IO 특화 버전 모두 제공합니다.
60+
// IO 역시 Monad<IO>를 만족하므로, 제네릭 M 버전이 FinT<IO, _> 컨텍스트까지
61+
// 타입 추론으로 커버합니다. 별도의 IO 특화 오버로드는 중복이므로 제거되었습니다.
6562
//
6663
// -----------------------------------------------------------------------------
6764
// 파일 구조 (partial class by source type)

0 commit comments

Comments
 (0)