@@ -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<IO, B> 변환: IO 모나드에 특화된 SelectMany
78- ///
79- /// LINQ 쿼리 표현식에서 Validation을 직접 사용 가능하게 함:
80- /// from validated in LimitSampleIdentifier.Validate(...) // Validation<Error, A> → FinT<IO, A>
81- /// from result in DoSomething(validated) // FinT<IO, B>
82- /// select result
83- ///
84- /// 사용 예:
85- /// FinT<IO, Unit> 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<IO, A>
159- /// from validated in validationSelector(val) // Validation<Error, B>
160- /// select result // C
161- ///
162- /// 사용 예:
163- /// FinT<IO, Response> usecase =
164- /// from request in GetRequest() // FinT<IO, Request>
165- /// from identifier in Identifier.Validate(request.Id) // Validation<Error, Identifier>
166- /// from saved in repository.Save(identifier) // FinT<IO, Entity>
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}
0 commit comments