public virtual void DoWork( IEnumerable <T> source, Action <T> longFunction) { var enumerator = source.GetEnumerator(); enumerator.MoveNext(); Lot <Thread> threads = new XLinkedListLot <Thread>(); foreach (var computation in this.computations) { var current = enumerator.Current; computation(current); var ts = new XLinkedList <Thread>(); ts.AddTail(new Thread(() => longFunction(current))); ts.Head?.Start(); threads = this.rotator.Rotate(ts, 1); if (!enumerator.MoveNext()) { break; } } foreach (var t in threads) { t.Join(); } enumerator.Dispose(); }
public virtual void PushRange( IEnumerable <T> source, long index, long length) { Lot <T> lot = new XLinkedListLot <T>( XLinkedList <T> .Create( source)); var array = new T[length - index]; long counter = zero; foreach (var item in lot) { if (counter < index) { continue; } if (counter >= length) { break; } array[counter] = item; ++counter; } this.stack.PushRange(array); }
public void PushRange( IEnumerable <T> source) { Lot <T> lot = new XLinkedListLot <T>( XLinkedList <T> .Create( source)); var array = new T[lot.Count]; long counter = zero; foreach (var item in lot) { array[counter] = item; ++counter; } this.stack.PushRange(array); }
public virtual Lot <T>[] Slice <T>( IEnumerable <T> finiteSource, Lot <int> slicePoints) { const byte zero = 0, one = 1; if (finiteSource == null) { return(new Lot <T> [zero]); } if (slicePoints == null || slicePoints.Count < one) { return(new Lot <T> [zero]); } ICollection <T> remainingItems = XLinkedList <T> .Create(finiteSource); var array = new Lot <T> [slicePoints.Count]; int counter = zero; foreach (var slicePoint in slicePoints) { var sequence = EH.Take( remainingItems, slicePoint); array[counter] = new XLinkedListLot <T>( XLinkedList <T> .Create( sequence)); ++counter; remainingItems = XLinkedList <T> .Create( EH.Skip( remainingItems, slicePoint)); } return(array); }
public virtual void Handle( DailyUi ui) { var r = this.runner; r?.Run <UiReaderWriter, UiReader>( (uiRW, reader) => { reader.ReadHomeNav( out var homeNavUi); uiRW.Write( homeNavUi, () => { homeNavUi.ActiveKeyLabel = NavKeyLabels.Daily; }); }); var showCurrent = true; r?.Run <SettingsHolder>(settings => { showCurrent = settings.ShowCurrent; }); StatisticsUi statsUi = null; r?.Run <UiReader>(reader => { reader.ReadStatistics( out var statisticsUi); statsUi = statisticsUi; }); var ll = new XLinkedListLot <string>(); r?.Run < StatisticsCalculator, DateCalculator, UiReaderWriter, TimeSpanViewer>( (statsCalc, dateCalc, uiRW, viewer) => { DateTime currentDay, start, end; if (showCurrent) { start = dateCalc.StartOfWeek(); end = dateCalc.EndOfWeek(); goto afterComputeRange; } start = uiRW.Read( statsUi, () => statsUi.StartDate); end = uiRW.Read( statsUi, () => statsUi.EndDate); afterComputeRange: currentDay = start; while (currentDay <= end) { var today = currentDay.Date; var tomorrow = today.AddDays(1); ll.AddTail( currentDay.Date.ToString( @"yyyy/MM/dd ddd") + @" ---- " + viewer.ReadableString( statsCalc.TimeWorked( today, tomorrow))); currentDay = currentDay.AddDays(1); } }); r?.Run <UiReaderWriter>(uiRW => { uiRW.Write( ui, () => { ui.Info = ll; }); }); }