66namespace IllidanS4 . SharpUtils . Collections . Reactive
77{
88 /// <summary>
9- /// Provides a way to represent a push iterator as a pull iterator.
9+ /// Provides a way to represent a push iterator as a pull iterator, using fibers .
1010 /// </summary>
1111 public class IterEnumerable < T > : IEnumerable < T >
1212 {
1313 readonly Action < Func < T , bool > > iterProc ;
14+ readonly IFiberFactory fiberFactory ;
1415
15- public IterEnumerable ( Action < Func < T , bool > > iterProc )
16+ public IterEnumerable ( Action < Func < T , bool > > iterProc , IFiberFactory fiberFactory )
1617 {
1718 this . iterProc = iterProc ;
19+ this . fiberFactory = fiberFactory ;
1820 }
1921
20- public IterEnumerable ( IIterable < T > iterable ) : this ( f => iterable . Iterate ( Iterator . Create ( f ) ) )
22+ public IterEnumerable ( IIterable < T > iterable , IFiberFactory fiberFactory ) : this ( f => iterable . Iterate ( Iterator . Create ( f ) ) , fiberFactory )
2123 {
2224
2325 }
2426
2527 public IEnumerator < T > GetEnumerator ( )
2628 {
27- return new Enumerator ( iterProc ) ;
29+ return new Enumerator ( iterProc , fiberFactory ) ;
2830 }
2931
3032 System . Collections . IEnumerator System . Collections . IEnumerable . GetEnumerator ( )
@@ -34,7 +36,8 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
3436
3537 sealed class Enumerator : IEnumerator < T >
3638 {
37- readonly Fiber enumFiber ;
39+ readonly FiberBase enumFiber ;
40+ readonly IFiberFactory fiberFactory ;
3841
3942
4043 int state ;
@@ -43,11 +46,12 @@ public T Current{
4346 get ; private set ;
4447 }
4548
46- Fiber mainFiber ;
49+ FiberBase mainFiber ;
4750
48- public Enumerator ( Action < Func < T , bool > > enumProc )
51+ public Enumerator ( Action < Func < T , bool > > enumProc , IFiberFactory fiberFactory )
4952 {
50- enumFiber = new Fiber (
53+ this . fiberFactory = fiberFactory ;
54+ enumFiber = fiberFactory . CreateNew (
5155 ( ) => {
5256 enumProc ( FiberNext ) ;
5357 state = - 1 ;
@@ -74,7 +78,7 @@ public bool MoveNext()
7478 {
7579 if ( state == 0 || state == 1 )
7680 {
77- mainFiber = Fiber . CurrentFiber ;
81+ mainFiber = fiberFactory . CurrentFiber ;
7882 try {
7983 enumFiber . Switch ( ) ;
8084 } finally {
@@ -100,7 +104,7 @@ public void Dispose()
100104 } else if ( state != - 1 )
101105 {
102106 state = - 1 ;
103- mainFiber = Fiber . CurrentFiber ;
107+ mainFiber = fiberFactory . CurrentFiber ;
104108 try {
105109 enumFiber . Switch ( ) ;
106110 } finally {
@@ -119,14 +123,14 @@ public void Reset()
119123
120124 public static class IterEnumerable
121125 {
122- public static IterEnumerable < T > Create < T > ( Action < Func < T , bool > > iterProc )
126+ public static IterEnumerable < T > Create < T > ( Action < Func < T , bool > > iterProc , IFiberFactory fiberFactory )
123127 {
124- return new IterEnumerable < T > ( iterProc ) ;
128+ return new IterEnumerable < T > ( iterProc , fiberFactory ) ;
125129 }
126130
127- public static IterEnumerable < T > Create < T > ( IIterable < T > iterable )
131+ public static IterEnumerable < T > Create < T > ( IIterable < T > iterable , IFiberFactory fiberFactory )
128132 {
129- return new IterEnumerable < T > ( iterable ) ;
133+ return new IterEnumerable < T > ( iterable , fiberFactory ) ;
130134 }
131135 }
132136}
0 commit comments