Skip to content

Commit fe537e6

Browse files
committed
Taking a fiber factory
1 parent 85140a8 commit fe537e6

1 file changed

Lines changed: 18 additions & 14 deletions

File tree

Collections/Reactive/IterEnumerable.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,27 @@
66
namespace 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

Comments
 (0)