SeqExt.QueryExpr.SeqOption名前空間に下のような関数を追加する。
publicstaticOption<ISeq<V>>SelectMany<T,U,V>(thisISeq<Option<T>>self,Func<T,Option<U>>f,Func<T,U,V>g){varres=newSystem.Collections.Generic.List<V>();foreach(varoptinself){if(opt.IsNone)returnOption.None;vart=LangExt.Unsafe.Option.GetValue(opt);varv=f(t).Bind(u =>Option.Some(g(t,u)));if(v.IsNone)returnOption.None;res.Add(LangExt.Unsafe.Option.GetValue(v));}returnOption.Some(res.ToSeq());}publicstaticOption<ISeq<V>>SelectMany<T,U,V>(thisOption<ISeq<T>>self,Func<T,Option<U>>f,Func<T,U,V>g){if(self.IsNone)returnOption.None;varxs=LangExt.Unsafe.Option.GetValue(self);varres=newSystem.Collections.Generic.List<V>();foreach(varxinxs){vart=x;varv=f(t).Bind(u =>Option.Some(g(t,u)));if(v.IsNone)returnOption.None;res.Add(LangExt.Unsafe.Option.GetValue(v));}returnOption.Some(res.ToSeq());}ネストするたびにSystem.Collections.Generic.List[T]を作るのは微妙。
→専用のシーケンス、もしくはIE[T]を実装するのもアリ。意図しない呼び出し(上の例では、上のバージョンのSelectManyを呼び出していないのに、下のバージョンのSelectManyが呼び出されてしまう恐れがある)も防げそうだし。
Resultや、逆バージョンも用意する?
SeqExt.QueryExpr.SeqOption名前空間に下のような関数を追加する。
ネストするたびにSystem.Collections.Generic.List[T]を作るのは微妙。
→専用のシーケンス、もしくはIE[T]を実装するのもアリ。意図しない呼び出し(上の例では、上のバージョンのSelectManyを呼び出していないのに、下のバージョンのSelectManyが呼び出されてしまう恐れがある)も防げそうだし。
Resultや、逆バージョンも用意する?