Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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;
                });
            });
        }