public static XmlWriter <XmlWriterNode <TInput> > Many <TInput, TOut>( this XmlWriterNode <TInput> writerNode, Func <TInput, IEnumerable <TOut> > func, XmlWriterAction <TOut> innerWriterAction) { return (state => { var oldInput = state.CurrentInput; var oldNode = state.Current; foreach (var element in (IEnumerable)func((TInput)state.CurrentInput)) { state.Current = writerNode.Node; state.CurrentInput = element; IResult <XmlWriterNode <TOut> > InnerWriter(State innerState) => new Result <XmlWriterNode <TOut> >(new XmlWriterNode <TOut>(innerState.Current), innerState); var appliedWriter = innerWriterAction(InnerWriter); appliedWriter(state); state.Current = oldNode; } state.CurrentInput = oldInput; return Result <TInput> .WriterNodeResultFromState(state); }); }
public static XmlWriter <XmlWriterNode <TInput> > Apply <TInput>(this XmlWriterNode <TInput> writerNode, XmlWriterAction <TInput> innerWriterAction) { return(state => { var oldInput = state.CurrentInput; var oldNode = state.Current; IResult <XmlWriterNode <TInput> > InnerWriter(State innerState) => new Result <XmlWriterNode <TInput> >(new XmlWriterNode <TInput>(innerState.Current), innerState); var appliedWriter = innerWriterAction(InnerWriter); appliedWriter(state); state.Current = oldNode; state.CurrentInput = oldInput; return Result <TInput> .WriterNodeResultFromState(state); }); }