public static IEnumerable<ICommandOutput> CopyPackagesToRepositories(this IPackageManager manager,
            DependencyResolutionResult dependencies,
            IEnumerable<IPackageRepository> repositoriesToWriteTo)
        {
            if (manager == null) throw new ArgumentNullException("manager");
            if (dependencies == null) throw new ArgumentNullException("dependencies");
            if (repositoriesToWriteTo == null) throw new ArgumentNullException("repositoriesToWriteTo");

            if (!dependencies.IsSuccess)
            {
                yield return DependencyResolutionFailed(dependencies);
                yield break;
            }

            foreach (var dependency in dependencies.Dependencies)
            {
                // fast forward to the source repository

                var repositoriesForDependency = repositoriesToWriteTo
                    .SkipWhile(x => x != dependency.Package.Source)
                    .Skip(1)
                    .ToList();

                if (repositoriesForDependency.Count == 0)
                    repositoriesForDependency = repositoriesToWriteTo.ToList();

                foreach (var repository in repositoriesForDependency.Where(x => x != null && x.CanPublish))
                {
                    yield return new Result("Copying '{0}' to '{1}'", dependency.Package.FullName, repository.Name);
                    manager.UpdateDependency(dependency, repository);
                }
            }
        }
 static IEnumerable<string> GetConfig(IEnumerable<string> configLines, string configName)
 {
     // Read everything from [configName] up to the next [section].
     return configLines
         .SkipWhile(l => !l.StartsWith(string.Format("[{0}]", configName), StringComparison.OrdinalIgnoreCase))
         .Skip(1)
         .TakeWhile(l => !l.StartsWith("[", StringComparison.OrdinalIgnoreCase))
         .Where(l => l.Contains('='));
 }
 private static TimeSpan GetInterval(IEnumerable<string> args)
 {
     return TimeSpan.FromMilliseconds(args
         .SkipWhile(a => a != "-interval")
         .Skip(1)
         .Select(int.Parse)
         .DefaultIfEmpty(100)
         .First());
 }
 private static int GetInterval(IEnumerable<string> args)
 {
     return args
         .SkipWhile(a => a != "-interval")
         .Skip(1)
         .Select(int.Parse)
         .DefaultIfEmpty(100)
         .First();
 }
Exemple #5
0
 public Result<IEnumerable<Token>, Error> Preprocess(
     IEnumerable<string> arguments,
     Func<IEnumerable<string>, Result<IEnumerable<Token>, Error>> tokenizer)
 {
     if (arguments.Any(arg => arg.EqualsOrdinal("--")))
     {
         var tokenizerResult = tokenizer(arguments.TakeWhile(arg => !arg.EqualsOrdinal("--")));
         var values = arguments.SkipWhile(arg => !arg.EqualsOrdinal("--")).Skip(1).Select(Token.Value);
         return tokenizerResult.Map(tokens => tokens.Concat(values));
     }
     if (arguments.Any(arg => arg.EqualsOrdinal("//")))
     {
         var tokenizerResult = tokenizer(arguments.TakeWhile(arg => !arg.EqualsOrdinal("--")));
         var values = arguments.SkipWhile(arg => !arg.EqualsOrdinal("//")).Skip(1).Select(Token.Value);
         return tokenizerResult.Map(tokens => tokens.Concat(values));
     }
     return tokenizer(arguments);
 }
        private static IEnumerable<Station> GetNeighbors(Station source, IEnumerable<Station> sortedStations, int maxDeltaZ)
        {
            var maxZ = source.CartesianLocation.Z;
            var minZ = maxZ - maxDeltaZ;

            var stations = sortedStations.SkipWhile(station => station.CartesianLocation.Z >= maxZ)
                .TakeWhile(station => station.CartesianLocation.Z >= minZ).ToList();

            return stations;
        }
 public static IEnumerable<KeyValuePair<string, IEnumerable<string>>> ForSequence(
     IEnumerable<Token> tokens)
 {
     return from t in tokens.Pairwise(
         (f, s) =>
                 f.IsName()
                     ? f.Text.ToKeyValuePair(tokens.SkipWhile(t => !t.Equals(f)).SkipWhile(t => t.Equals(f)).TakeWhile(v => v.IsValue()).Select(x => x.Text).ToArray())
                     : string.Empty.ToKeyValuePair())
            where t.Key.Length > 0 && t.Value.Any()
            select t;
 }
 private static IEnumerable<KeyValuePair<string, IEnumerable<string>>> SequenceTokensToKeyValuePairEnumerable(
     IEnumerable<Token> tokens)
 {
     return from t in tokens.Pairwise(
         (f, s) =>
                 f.IsName()
                     ? CreateValue(f.Text, tokens.SkipWhile(t => t.Equals(f)).TakeWhile(v => v.IsValue()).Select(x => x.Text).ToArray())
                     : CreateValue(string.Empty))
            where t.Key.Length > 0 && t.Value.Any()
            select t;
 }
        public bool TryPatrol(IEnumerable<CityBlock> blocks)
        {
            var eligible = blocks.SkipWhile(x => x.IsPatrolled).ToArray();

            if (eligible.Count() < DummyRange)
                return false;

            foreach (var block in eligible.Take(DummyRange))
                block.Force = this;

            return true;
        }
Exemple #10
0
 public static List <string> ParseHtml(IEnumerable <string> lines)
 {
     return(lines
            .SkipWhile(l => !l.Trim().Equals("*@"))
            .Skip(1)
            .SkipWhile(l => string.IsNullOrWhiteSpace(l))
            .TakeWhile(l => !l.Trim().Equals("@code {"))
            .Reverse()
            .SkipWhile(l => string.IsNullOrWhiteSpace(l))
            .Reverse()
            .ToList());
 }
        private string GenerateName()
        {
            // a framework name is a random markov chain that terminates in a space.
            IEnumerable <string> generatedName = nameGenerator.Generate();
            var name = string.Join("",
                                   generatedName.SkipWhile(c => !char.IsLetterOrDigit(c[0])).TakeWhile(c => c != " ")
                                   );

            return(name.IndexOf("js", StringComparison.OrdinalIgnoreCase) == -1
                ? name + ".js"
                : name);
        }
Exemple #12
0
 public static StatePair<IEnumerable<Token>> PreprocessDashDash(
     IEnumerable<string> arguments,
     Func<IEnumerable<string>, StatePair<IEnumerable<Token>>> tokenizer)
 {
     if (arguments.Any(arg => arg.EqualsOrdinal("--")))
     {
         var tokenizerResult = tokenizer(arguments.TakeWhile(arg => !arg.EqualsOrdinal("--")));
         var values = arguments.SkipWhile(arg => !arg.EqualsOrdinal("--")).Skip(1).Select(Token.Value);
         return tokenizerResult.MapValue(tokens => tokens.Concat(values));
     }
     return tokenizer(arguments);
 }
Exemple #13
0
 public static Result <IEnumerable <Token>, Error> PreprocessDashDash(
     IEnumerable <string> arguments,
     Func <IEnumerable <string>, Result <IEnumerable <Token>, Error> > tokenizer)
 {
     if (arguments.Any(arg => arg.EqualsOrdinal("--")))
     {
         var tokenizerResult = tokenizer(arguments.TakeWhile(arg => !arg.EqualsOrdinal("--")));
         var values          = arguments.SkipWhile(arg => !arg.EqualsOrdinal("--")).Skip(1).Select(Token.ValueForced);
         return(tokenizerResult.Map(tokens => tokens.Concat(values)));
     }
     return(tokenizer(arguments));
 }
        private Month createMonthWithContainDaysOfDifferentMonth(IEnumerable <RelationalDay> days, DateTime monthFirstDay, DayOfWeek dayOfOrderStart)
        {
            RelationalDay firstDay = days.Reverse()
                                     .SkipWhile(x => monthFirstDay < x.Day)
                                     .FirstOrDefault(x => x.Day.DayOfWeek == dayOfOrderStart)
                                     ?? days.SkipWhile(x => x.Day < monthFirstDay).First();

            Day  previousWeekEndDay = new DateTime(firstDay.Day.Year, firstDay.Day.Month, firstDay.Day.DayOfMonth).AddDays(-1).ToDay();
            var  weeks       = new List <Week>();
            bool hasNextWeek = true;

            while (hasNextWeek)
            {
                int count = 0;
                List <RelationalDay> daysOfWeek = days.SkipWhile(x => x.Day < firstDay.Day)
                                                  .SkipWhile(x => x.Day <= previousWeekEndDay)
                                                  .Do(_ => count++)
                                                  .TakeWhile(x => count == 1 || x.Day.DayOfWeek != dayOfOrderStart)
                                                  .ToList();

                if (daysOfWeek.Count != 0 && (weeks.Count != 0 && daysOfWeek.FirstOrDefault()?.Day?.Month == monthFirstDay.Month || weeks.Count == 0))
                {
                    weeks.Add(new Week {
                        Days = daysOfWeek
                    });
                    previousWeekEndDay = daysOfWeek.Last().Day;
                }
                else
                {
                    hasNextWeek = false;
                }
            }

            return(new Month
            {
                Year = monthFirstDay.Year,
                MonthOfYear = monthFirstDay.Month,
                Weeks = weeks
            });
        }
Exemple #15
0
        private List <TaskDevice> getDevice()
        {
            IEnumerable <TaskDevice> filter = (IEnumerable <TaskDevice>)Common.getDeviecSorByDevice(CurTask.Type);
            IEnumerable <TaskDevice> added  = (IEnumerable <TaskDevice>)Common.getDeviecSorByTask(CurTask.Name);
            string lastname  = Common.GetLastTaskName(CurTask.Name);
            string last2name = Common.GetLastTaskName(lastname);
            IEnumerable <TaskDevice> lastadded  = (IEnumerable <TaskDevice>)Common.getDeviecSorByTask(lastname, CurTask.Type);
            IEnumerable <TaskDevice> last2added = (IEnumerable <TaskDevice>)Common.getDeviecSorByTask(last2name, CurTask.Type);
            List <TaskDevice>        temp       = new List <TaskDevice>();

            if (filter.Count() != 0)
            {
                temp = filter.ToList();
                var remain = temp.RemoveAll(t => added.Any(a => a.ID == t.ID) || lastadded.Any(a => a.ID == t.ID) || last2added.Any(a => a.ID == t.ID));
                foreach (TaskDevice item in temp)
                {
                    item.GroupBy = GROUP_BY_Remain;
                }
            }

            added      = added.SkipWhile(t => string.IsNullOrEmpty(t.ID));
            lastadded  = lastadded.SkipWhile(t => string.IsNullOrEmpty(t.ID));
            last2added = last2added.SkipWhile(t => string.IsNullOrEmpty(t.ID));
            foreach (TaskDevice item in added)
            {
                item.GroupBy = GROUP_BY_Added;
            }
            temp.AddRange(added);
            foreach (TaskDevice item in lastadded)
            {
                item.IsChecked = false;
                item.GroupBy   = GROUP_BY_PreTask + "  " + lastname;
            }
            temp.AddRange(lastadded);
            foreach (TaskDevice item in last2added)
            {
                item.IsChecked = false;
                item.GroupBy   = GROUP_BY_Earlier + "  " + last2name;
            }
            temp.AddRange(last2added);

            if (temp.Count() == 0)
            {
                TaskDevice d = new TaskDevice();
                d.Photo      = Common.getImageByLocal("Err.png");
                d.Company    = "清单中没有符合条件的设备";
                d.DeviceType = "错误";
                d.IsChecked  = false;
                temp.Add(d);
            }
            return(temp);
        }
Exemple #16
0
        private static Hd44780Configuration LoadMcp23008Configuration(IEnumerable <string> args)
        {
            var addressText = args.SkipWhile(s => !String.Equals(s, "mcp23008", StringComparison.InvariantCultureIgnoreCase)).Skip(1).DefaultIfEmpty("0x20").First();
            var address     = addressText.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)
                ? Int32.Parse(addressText.Substring(2), NumberStyles.HexNumber)
                : Int32.Parse(addressText);

            const Mcp23008Pin registerSelectPin = Mcp23008Pin.Pin1;
            const Mcp23008Pin clockPin          = Mcp23008Pin.Pin2;
            const Mcp23008Pin backlightPin      = Mcp23008Pin.Pin7;

            var dataPins = new[]
            {
                Mcp23008Pin.Pin3,
                Mcp23008Pin.Pin4,
                Mcp23008Pin.Pin5,
                Mcp23008Pin.Pin6
            };

            Console.WriteLine();
            Console.WriteLine("Using I2C connection over MCP23008 Expander");
            Console.WriteLine("\tRegister Select: {0}", registerSelectPin);
            Console.WriteLine("\tClock: {0}", clockPin);
            Console.WriteLine("\tData 1: {0}", dataPins[0]);
            Console.WriteLine("\tData 2: {0}", dataPins[1]);
            Console.WriteLine("\tData 3: {0}", dataPins[2]);
            Console.WriteLine("\tData 4: {0}", dataPins[3]);
            Console.WriteLine("\tBacklight: {0}", backlightPin);
            Console.WriteLine("\tRead/write: GND");
            Console.WriteLine();

            const ConnectorPin sdaPin = ConnectorPin.P1Pin03;
            const ConnectorPin sclPin = ConnectorPin.P1Pin05;

            var driver = new I2cDriver(sdaPin.ToProcessor(), sclPin.ToProcessor())
            {
                ClockDivider = 512
            };
            var connection = new Mcp23008I2cConnection(driver.Connect(address));

            var retVal = new Hd44780Configuration(driver)
            {
                Pins = new Hd44780Pins(
                    connection.Out(registerSelectPin),
                    connection.Out(clockPin),
                    dataPins.Select(pin => (IOutputBinaryPin)connection.Out(pin)))
            };

            retVal.Pins.Backlight = connection.Out(backlightPin);

            return(retVal);
        }
Exemple #17
0
        private static Hd44780Configuration LoadPcf8574Configuration(IEnumerable <string> args)
        {
            var addressText = args.SkipWhile(s => !String.Equals(s, "pcf8574", StringComparison.InvariantCultureIgnoreCase)).Skip(1).DefaultIfEmpty("0x20").First();
            var address     = addressText.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)
                ? Int32.Parse(addressText.Substring(2), NumberStyles.HexNumber)
                : Int32.Parse(addressText);

            const Pcf8574Pin clockPin          = Pcf8574Pin.P2;
            const Pcf8574Pin readWritePin      = Pcf8574Pin.P1;
            const Pcf8574Pin registerSelectPin = Pcf8574Pin.P0;
            const Pcf8574Pin backlightPin      = Pcf8574Pin.P3;
            var dataPins = new[]
            {
                Pcf8574Pin.P4,
                Pcf8574Pin.P5,
                Pcf8574Pin.P6,
                Pcf8574Pin.P7
            };

            Console.WriteLine();
            Console.WriteLine("Using I2C connection over PCF8574 expander");
            Console.WriteLine("\tRegister Select: {0}", registerSelectPin);
            Console.WriteLine("\tClock: {0}", clockPin);
            Console.WriteLine("\tData 1: {0}", dataPins[0]);
            Console.WriteLine("\tData 2: {0}", dataPins[1]);
            Console.WriteLine("\tData 3: {0}", dataPins[2]);
            Console.WriteLine("\tData 4: {0}", dataPins[3]);
            Console.WriteLine("\tBacklight: {0}", backlightPin);
            Console.WriteLine("\tRead/write: {0}", readWritePin);
            Console.WriteLine();

            const ConnectorPin sdaPin = ConnectorPin.P1Pin03;
            const ConnectorPin sclPin = ConnectorPin.P1Pin05;

            var driver = new I2cDriver(sdaPin.ToProcessor(), sclPin.ToProcessor())
            {
                ClockDivider = 512
            };
            var connection = new Pcf8574I2cConnection(driver.Connect(address));

            return(new Hd44780Configuration(driver)
            {
                Pins = new Hd44780Pins(
                    connection.Out(registerSelectPin),
                    connection.Out(clockPin),
                    dataPins.Select(p => (IOutputBinaryPin)connection.Out(p)))
                {
                    Backlight = connection.Out(backlightPin),
                    ReadWrite = connection.Out(readWritePin),
                }
            });
        }
        private Month createMonth(IEnumerable <RelationalDay> days, DateTime monthFirstDay, DayOfWeek dayOfOrderStart)
        {
            RelationalDay firstDay = days.SkipWhile(x => x.Day < monthFirstDay)
                                     .First();

            DayOfWeek dayOfOrderEnd      = calculateDayOfOrderEnd(dayOfOrderStart);
            Day       previousWeekEndDay = new DateTime(firstDay.Day.Year, firstDay.Day.Month, firstDay.Day.DayOfMonth).AddDays(-1).ToDay();
            var       weeks       = new List <Week>();
            bool      hasNextWeek = true;

            while (hasNextWeek)
            {
                bool isEndWeek = false;
                List <RelationalDay> daysOfWeek = days.SkipWhile(x => x.Day < firstDay.Day)
                                                  .SkipWhile(x => x.Day <= previousWeekEndDay)
                                                  .TakeWhile(x => x.Day.Month == monthFirstDay.Month && isEndWeek == false)
                                                  .Do(x => isEndWeek = x.Day.DayOfWeek == dayOfOrderEnd)
                                                  .ToList();

                if (daysOfWeek.Count != 0)
                {
                    weeks.Add(new Week {
                        Days = daysOfWeek
                    });
                    previousWeekEndDay = daysOfWeek.Last().Day;
                }
                else
                {
                    hasNextWeek = false;
                }
            }

            return(new Month
            {
                Year = monthFirstDay.Year,
                MonthOfYear = monthFirstDay.Month,
                Weeks = weeks
            });
        }
Exemple #19
0
        static void TestFiltering()
        {
            Assert(Enumerable.SequenceEqual(_words, _words.Concat(_words).Distinct()));

            Assert(Enumerable.SequenceEqual(_words, _words.Skip(0)));
            Assert(_words.Skip(1).First() == "quick");
            Assert(_words.SkipWhile(w => w.Length == 3).First() == "quick");

            Assert(_words.Take(2).Last() == "quick");
            Assert(_words.TakeWhile(w => w.Length == 3).Single() == "the");

            Assert(_words.Where(w => w.Length == 5).Count() == 2);
        }
Exemple #20
0
        /// <summary>
        /// Split a page of data into its chunks.
        /// </summary>
        /// <param name="page">A string containing chunks of textual data, separated by whitespace.</param>
        /// <returns>The chunks, split on newlines.</returns>
        IEnumerable <string> getPageChunks(string page)
        {
            //a page is made up of a series of chunks, which contain field data
            IEnumerable <string> chunks = page.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

            //skip the header rows when starting a new page
            if (FieldPatterns.RunDate.IsMatch(chunks.First()))
            {
                chunks = chunks.SkipWhile(s => !FieldPatterns.DataHeader.IsMatch(s)).Skip(1);
            }

            return(chunks);
        }
        public override void InitialiseRelationships(IEnumerable <Clause> clause)
        {
            _ = clause ?? throw new ArgumentNullException(nameof(clause));

            // TODO: support more than one verb?? Or zero verbs?
            // Find the noun before and after this verb.
            var beforeMe = clause.TakeWhile(x => x != this);
            var afterMe  = clause.SkipWhile(x => x != this).Skip(1).Take(Int32.MaxValue);

            // Link to this verb.
            this.Subject = beforeMe.ToList();
            this.Object  = afterMe.ToList();
        }
Exemple #22
0
        private static TEnum?NextIn <TEnum>(this TEnum value, IEnumerable <TEnum> inValues)
            where TEnum : struct, Enum
        {
            var comparer = EqualityComparer <TEnum> .Default;

            var next = inValues
                       .SkipWhile(e => !comparer.Equals(e, value))
                       .Skip(1)
                       .Cast <TEnum?>()
                       .FirstOrDefault();

            return(next);
        }
        // analogue of string.Split
        public static IEnumerable <IEnumerable <T> > Split <T>(this IEnumerable <T> xs, Func <T, bool> predicate)
        {
            var result = new List <IEnumerable <T> >();

            IEnumerable <T> p = xs;

            while (p.Any())
            {
                p = p.SkipWhile(predicate);

                var chunk = p.TakeWhile(x => !predicate(x));

                if (chunk.Any())
                {
                    result.Add(chunk);
                }

                p = p.SkipWhile(x => !predicate(x));
            }

            return(result);
        }
Exemple #24
0
        /// <summary>
        /// Returns all elements in a sequence that follow the first occurence of an element that satisfies a specified condition.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sequence"></param>
        /// <param name="predicate"></param>
        /// <returns></returns>
        public static IEnumerable <T> AfterFirst <T>(this IEnumerable <T> sequence, Func <T, bool> predicate)
        {
            if (sequence == null)
            {
                throw new ArgumentNullException(nameof(sequence));
            }
            if (predicate == null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }

            return(sequence.SkipWhile(x => !predicate.Invoke(x)).Skip(1));
        }
Exemple #25
0
        private void GetFilterDivinationData(IEnumerable <string> lines)
        {
            DivinationValue value;

            while (lines.Any())
            {
                lines = lines.SkipWhile(aline => !aline.StartsWith("Show ") && !aline.StartsWith("Hide "));
                if (!lines.Any())
                {
                    return;
                }
                string line = lines.First();
                if (!line.Contains("# Divination Cards - "))
                {
                    continue;
                }
                else if (line.Contains("10c+"))
                {
                    value = DivinationValue.Chaos10;
                }
                else if (line.Contains("2-10c"))
                {
                    value = DivinationValue.Chaos2to10;
                }
                else if (line.Contains("<2c") || line.Contains("< 2c"))
                {
                    value = DivinationValue.ChaosLess2;
                }
                else if (line.Contains("Nearly Worthless"))
                {
                    value = DivinationValue.NearlyWorthless;
                }
                else if (line.Contains("Worthless"))
                {
                    value = DivinationValue.Worthless;
                }
                else
                {
                    lines = lines.Skip(1);
                    continue;
                }
                lines = lines.Skip(1).SkipWhile(aline => !aline.TrimStart().StartsWith("BaseType ") && !aline.StartsWith("Show ") && !aline.StartsWith("Hide "));
                line  = lines.First().Trim();
                if (line.StartsWith("BaseType "))
                {
                    IEnumerable <string> baseTypes = SplitQuotedList(line).Skip(1);
                    FillFilterDivinationData(SC, baseTypes, value);
                    FillFilterDivinationData(HC, baseTypes, value);
                }
            }
        }
Exemple #26
0
        private Individual GetRandomIndividualByFitnessProbability(IEnumerable <Individual> individualsSortedByFitness, double fitnessSum)
        {
            double targetFitness = r.NextDouble() * fitnessSum;

            double fitness = 0;

            Individual individual = individualsSortedByFitness.SkipWhile(i => { if ((fitness + i.Fitness) >= targetFitness)
                                                                                {
                                                                                    return(false);
                                                                                }
                                                                                fitness += i.Fitness; return(true); }).FirstOrDefault();

            return(individual);
        }
        private ParserContext HandleLocation(IEnumerable<string> parts)
        {
            var locationParts =
                parts.SkipWhile(p => !p.StartsWith("@@"))
                .Select(s => new String(s.SkipWhile(c => c.Equals('@')).ToArray()))  //Take out the leading @@
                .ToArray();

            if (!locationParts.Any())
                return CurrentParserContext;

            CurrentParserContext.ContextLocation = String.Join(" ", locationParts);

            return CurrentParserContext;
        }
Exemple #28
0
        public static T Next <T>(this IEnumerable <T> source, T item)
        {
            if (item == null)
            {
                return(default(T));
            }
            var res = source.SkipWhile(x => x.GetHashCode() != item.GetHashCode()).Skip(1).FirstOrDefault();

            if (res == null)
            {
                return(item);
            }
            return(res);
        }
        public static void SkipWhileSyntax()
        {
            IEnumerable <BuildingCategory> categories = DataSource.BuildingCategories;

            //Select all categories, starting from Storage and following:

            var fromStorageOn = categories.SkipWhile(c => !c.Category.StartsWith("Storage"));

            Console.WriteLine("All elements, beginning with Storage and following:");
            foreach (var c in fromStorageOn)
            {
                Console.WriteLine(c.Category);
            }
        }
Exemple #30
0
        public CrossWordLineTask(IEnumerable <int?> groupsOfCells)
        {
            _groups = groupsOfCells.SkipWhile(g => !g.HasValue)
                      .Select(g =>
            {
                if (g.HasValue)
                {
                    return(g.Value);
                }

                throw new InvalidOperationException("Missed one of values in sequence");
            })
                      .ToList();
        }
        public static IEnumerable <T> ParentChainReverse <T>(this T?start,
                                                             Func <T, T> parentSelector,
                                                             Func <T, bool>?stopCondition = null,
                                                             bool skipStart = false)
            where T : class
        {
            IEnumerable <T> chain = ParentChain(start, parentSelector, skipStart: skipStart).Reverse();

            if (stopCondition != null)
            {
                chain = chain.SkipWhile(item => !stopCondition(item));
            }
            return(chain);
        }
Exemple #32
0
        private static IEnumerable <IEnumerable <ProgramLine> > DoGeneratedLiteralDc(
            this IEnumerable <ProgramLine> lines, LabelTable lblTable)
        {
            // リテラルから生成される DC 命令は、END 命令の直前にまとめて配置される。
            // END 命令の前までに続いて、生成された DC 命令を出力し、その後に END 命令以降を出力する。
            Boolean notEnd(ProgramLine line) => !line.IsEnd();

            yield return(lines.TakeWhile(notEnd));

            yield return(lines.Select((line) => line.GenerateLiteralDc(lblTable))
                         .Where((generatedLine) => generatedLine != null));

            yield return(lines.SkipWhile(notEnd));
        }
Exemple #33
0
        private void GetFilterUniqueData(IEnumerable <string> lines)
        {
            UniqueValue value;

            while (lines.Any())
            {
                lines = lines.SkipWhile(aline => !aline.StartsWith("Show ") && !aline.StartsWith("Hide "));
                if (!lines.Any())
                {
                    return;
                }
                string line = lines.ElementAt(0);

                if (!line.Contains("# Uniques -"))
                {
                    continue;
                }

                if (line.Contains("15c+"))
                {
                    value = UniqueValue.Chaos15;
                }
                else if (line.Contains("5-15c"))
                {
                    value = UniqueValue.Chaos5to15;
                }
                else if (line.Contains("3-5c"))
                {
                    value = UniqueValue.Chaos3to5;
                }
                else if (line.Contains("Limited"))
                {
                    value = UniqueValue.Limited;
                }
                else
                {
                    //(line.Contains("<67")
                    lines = lines.Skip(1);
                    continue;
                }
                lines = lines.Skip(1).SkipWhile(aline => !aline.TrimStart().StartsWith("BaseType ") && !aline.StartsWith("Show ") && !aline.StartsWith("Hide "));
                line  = lines.First().TrimStart();
                if (line.StartsWith("BaseType "))
                {
                    IEnumerable <string> baseTypes = SplitQuotedList(line).Skip(1);
                    FillFilterUniqueData(SC, baseTypes, value);
                    FillFilterUniqueData(HC, baseTypes, value);
                }
            }
        }
Exemple #34
0
        public async override Task ApplyAsync(ISearchContext context, ISearchResult result)
        {
            // Filter all species that don't have the given species as an ancestor.

            ISpecies ancestorSpecies            = (await context.Database.GetSpeciesAsync(Value)).FirstOrDefault();
            Dictionary <long, bool> resultCache = new Dictionary <long, bool>();

            await result.FilterByAsync(async (species) => {
                bool isFiltered = true;

                if (ancestorSpecies != null && species.Id != ancestorSpecies.Id && !resultCache.TryGetValue(species.Id.Value, out isFiltered))
                {
                    // Get all of the ancestor IDs for this species, ordered from the oldest to the latest.
                    // Skip until we find the ancestor ID we're looking for.

                    IEnumerable <long> ancestorIds = await context.Database.GetAncestorIdsAsync(species.Id);

                    // Skip until we find the ID of the ancestor we're looking for.
                    // If we find it, all species beyond this point also have the ancestor.
                    // If we don't find it, none of these species has the ancestor.

                    IEnumerable <long> idsWithAncestor = ancestorIds.SkipWhile(id => id != ancestorSpecies.Id);

                    if (idsWithAncestor.Any())
                    {
                        // If the species does have the ancestor, do not filter it.

                        isFiltered = false;

                        foreach (long id in idsWithAncestor)
                        {
                            resultCache[id] = false;
                        }
                    }
                    else
                    {
                        // If the species does not have the ancestor, filter it.

                        isFiltered = true;

                        foreach (long id in ancestorIds)
                        {
                            resultCache[id] = true;
                        }
                    }
                }

                return(isFiltered);
            }, Invert);
        }
Exemple #35
0
        private void ParseArguments(IEnumerable <string> args)
        {
            _targetNames.AddRange(args.TakeWhile(s => !s.StartsWith("-")));
            var arguments = new Queue <string>(args.SkipWhile(s => !s.StartsWith("-")));

            while (arguments.Count > 0)
            {
                var argument = arguments.Dequeue();

                var endTypeIndex = argument.IndexOf(":");
                var type         = argument.Substring(1, endTypeIndex - 1);

                string name;
                string value;
                switch (type)
                {
                case "parameter":
                case "p":
                    var endNameIndex = argument.IndexOf("=", endTypeIndex + 1);
                    if (endNameIndex == -1)
                    {
                        throw new BuildCsException("Parameter argument is mal-formed. Correct formation is -p:<name>=<value>");
                    }

                    name  = argument.Substring(endTypeIndex + 1, endNameIndex - endTypeIndex - 1);
                    value = argument.Substring(endNameIndex + 1);
                    _parameters.Add(name, value);
                    break;

                case "verbosity":
                case "v":
                    value = argument.Substring(endTypeIndex + 1);
                    MessageLevel level;
                    if (!Enum.TryParse <MessageLevel>(value, out level))
                    {
                        throw new BuildCsException("Unknown logLevel '{0}'.".F(value));
                    }
                    Verbosity = level;
                    break;

                case "listener":
                    value = argument.Substring(endTypeIndex + 1);
                    _listeners.Add(value);
                    break;

                default:
                    throw new BuildCsException("Unknown argument type: {0}".F(type));
                }
            }
        }
Exemple #36
0
        private static string GetFloodwatchThresholds(IEnumerable <HilltopFeed> thresholdsSite)
        {
            var body = "";

            body += "<Thresholds>";
            foreach (var threshold in thresholdsSite.SkipWhile(p => p.Indicator.Equals("NoThreshold", StringComparison.OrdinalIgnoreCase)))
            {
                body += "<Line Value='" + threshold.Minimum + "' Colour='Black' Title='" + threshold.GraphText + "' />";
                body += "<Region Min='" + threshold.Minimum + "' Max='" + threshold.Maximum + "' Colour='" + threshold.Colour + "' />";
            }
            body += "</Thresholds>";

            return(body);
        }
 /// <summary>
 /// Разделяет исходный список source на блоки,
 /// используя указанный предикат splitterSelector для определения элементов-разделителей
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="source">Исходный список</param>
 /// <param name="splitterSelector">Предикат для выбора разделителей списка</param>
 /// <returns></returns>
 public static IEnumerable <IEnumerable <T> > Split <T>(this IEnumerable <T> source, Func <T, bool> splitterSelector)
 {
     return
         (source
          .GroupBy(
              z => splitterSelector(z) || z.Equals(source.First()),
              h =>
              source
              .SkipWhile(t => !t.Equals(h))
              .Skip(h.Equals(source.First()) ? 0 : 1)
              .TakeWhile(j => !splitterSelector(j)))
          .Where(ww => ww.Key)
          .SelectMany(x => x.Select(xx => xx.Select(xxx => xxx))));
 }
Exemple #38
0
        /// <summary>
        /// Given an element in a sequence, returns the next element
        /// or throws if current was the last one
        /// (notice: performance penalty, use with caution)
        /// </summary>
        /// <typeparam name="TSource"></typeparam>
        /// <param name="source"></param>
        /// <param name="current"></param>
        /// <returns></returns>
        public static TSource Next <TSource>(this IEnumerable <TSource> source, TSource current)
        {
            IEnumerable <TSource> rest = source.SkipWhile(item =>
                                                          !EqualityComparer <TSource> .Default.Equals(item, current)).Skip(1);

            TSource next = rest.FirstOrDefault();

            if (Equals(default(TSource), next))
            {
                throw new ArgumentException("The given element is the last one in the sequence");
            }

            return(next);
        }
Exemple #39
0
        private static IEnumerable <Product> GetProductsForPeriod(IEnumerable <string[]> splitData, int i)
        {
            //var products = new List<IProduct>();
            var productsData = splitData.SkipWhile(x => !x.Contains("3. Товарные показатели"));

            //foreach (var productRow in productsData)
            //{
            //    if (string.IsNullOrWhiteSpace(productRow[2]))
            //        continue;

            //    products.Add(new Product(productRow[2], new Revenue(Parse(productRow[i]), Parse(productRow[i + 1]))));
            //}
            return(productsData.Where(x => !string.IsNullOrWhiteSpace(x[2])).Select(x => new Product(x[2], new Revenue(Parse(x[i]), Parse(x[i + 1])))));
        }
        private static Hd44780Configuration LoadPcf8574Configuration(IEnumerable<string> args)
        {
            var addressText = args.SkipWhile(s => !String.Equals(s, "pcf8574", StringComparison.InvariantCultureIgnoreCase)).Skip(1).DefaultIfEmpty("0x20").First();
            var address = addressText.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)
                ? Int32.Parse(addressText.Substring(2), NumberStyles.HexNumber)
                : Int32.Parse(addressText);

            const Pcf8574Pin clockPin = Pcf8574Pin.P2;
            const Pcf8574Pin readWritePin = Pcf8574Pin.P1;
            const Pcf8574Pin registerSelectPin = Pcf8574Pin.P0;
            const Pcf8574Pin backlightPin = Pcf8574Pin.P3;
            var dataPins = new[]
            {
                Pcf8574Pin.P4,
                Pcf8574Pin.P5,
                Pcf8574Pin.P6,
                Pcf8574Pin.P7
            };

            Console.WriteLine();
            Console.WriteLine("Using I2C connection over PCF8574 expander");
            Console.WriteLine("\tRegister Select: {0}", registerSelectPin);
            Console.WriteLine("\tClock: {0}", clockPin);
            Console.WriteLine("\tData 1: {0}", dataPins[0]);
            Console.WriteLine("\tData 2: {0}", dataPins[1]);
            Console.WriteLine("\tData 3: {0}", dataPins[2]);
            Console.WriteLine("\tData 4: {0}", dataPins[3]);
            Console.WriteLine("\tBacklight: {0}", backlightPin);
            Console.WriteLine("\tRead/write: {0}", readWritePin);
            Console.WriteLine();

            const ConnectorPin sdaPin = ConnectorPin.P1Pin03;
            const ConnectorPin sclPin = ConnectorPin.P1Pin05;

            var driver = new I2cDriver(sdaPin.ToProcessor(), sclPin.ToProcessor()) { ClockDivider = 512 };
            var connection = new Pcf8574I2cConnection(driver.Connect(address));

            return new Hd44780Configuration(driver)
            {
                Pins = new Hd44780Pins(
                    connection.Out(registerSelectPin),
                    connection.Out(clockPin),
                    dataPins.Select(p => (IOutputBinaryPin)connection.Out(p)))
                {
                    Backlight = connection.Out(backlightPin),
                    ReadWrite = connection.Out(readWritePin),
                }
            };
        }
        private static Hd44780Configuration LoadMcp23008Configuration(IEnumerable<string> args)
        {
            var addressText = args.SkipWhile(s => !String.Equals(s, "mcp23008", StringComparison.InvariantCultureIgnoreCase)).Skip(1).DefaultIfEmpty("0x20").First();
            var address = addressText.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)
                ? Int32.Parse(addressText.Substring(2), NumberStyles.HexNumber)
                : Int32.Parse(addressText);

            const Mcp23008Pin registerSelectPin = Mcp23008Pin.Pin1;
            const Mcp23008Pin clockPin = Mcp23008Pin.Pin2;
            const Mcp23008Pin backlightPin = Mcp23008Pin.Pin7;

            var dataPins = new[]
            {
                Mcp23008Pin.Pin3,
                Mcp23008Pin.Pin4,
                Mcp23008Pin.Pin5,
                Mcp23008Pin.Pin6
            };

            Console.WriteLine();
            Console.WriteLine("Using I2C connection over MCP23008 Expander");
            Console.WriteLine("\tRegister Select: {0}", registerSelectPin);
            Console.WriteLine("\tClock: {0}", clockPin);
            Console.WriteLine("\tData 1: {0}", dataPins[0]);
            Console.WriteLine("\tData 2: {0}", dataPins[1]);
            Console.WriteLine("\tData 3: {0}", dataPins[2]);
            Console.WriteLine("\tData 4: {0}", dataPins[3]);
            Console.WriteLine("\tBacklight: {0}", backlightPin);
            Console.WriteLine("\tRead/write: GND");
            Console.WriteLine();

            const ConnectorPin sdaPin = ConnectorPin.P1Pin03;
            const ConnectorPin sclPin = ConnectorPin.P1Pin05;

            var driver = new I2cDriver(sdaPin.ToProcessor(), sclPin.ToProcessor()) { ClockDivider = 512 };
            var connection = new Mcp23008I2cConnection(driver.Connect(address));

            var retVal = new Hd44780Configuration(driver)
            {
                Pins = new Hd44780Pins(
                    connection.Out(registerSelectPin),
                    connection.Out(clockPin),
                    dataPins.Select(pin => (IOutputBinaryPin)connection.Out(pin)))
            };

            retVal.Pins.Backlight = connection.Out(backlightPin);

            return retVal;
        }
 private static IEnumerable<Token> PartitionSequences(
     IEnumerable<Token> tokens,
     Func<string, Maybe<Tuple<DescriptorType, Maybe<int>>>> typeLookup)
 {
     return from tseq in tokens.Pairwise(
         (f, s) =>     
                 f.IsName() && s.IsValue()
                     ? typeLookup(f.Text).Return(info =>
                            info.Item1 == DescriptorType.Sequence
                                 ? new[] { f }.Concat(tokens.SkipWhile(t => t.Equals(f)).TakeWhile(v => v.IsValue()).Take(MaybeExtensions.Return(info.Item2, items => items, 0)))
                                 : new Token[] { } , new Token[] { })
                     : new Token[] {})
         from t in tseq
         select t;
 }
Exemple #43
0
        public static bool AllEqual([NotNull] this IEnumerable <object> values, [CanBeNull] out object value)
        {
            value = null;
            var firstNotNull = values.FirstOrDefault(x => x != null);

            // Either empty, or everything is null
            if (firstNotNull == null)
            {
                return(true);
            }

            value = firstNotNull;

            return(values.SkipWhile(x => x != firstNotNull).All(firstNotNull.Equals));
        }
Exemple #44
0
        /// <summary>
        /// 要素の取得(複数)
        /// SkipWhile : 指定条件の要素をスキップして取得
        /// </summary>
        private static void SkipWhile()
        {
            // SkipWhileの動作(Idが6より小さい要素をスキップして取得)
            var skipWhile = sampleData001.SkipWhile(x => x.Id < 6);

            // 取り扱いデータを表示
            ShowSample001();

            // 結果を表示
            Console.WriteLine("------------------------------");
            Console.WriteLine("Enumerable.SkipWhile()のサンプルです");
            Console.WriteLine("\tSkipWhile(x => x.Id < 6)により(Id < 6)となる要素をスキップして残りの要素を取得");
            Console.WriteLine("------------------------------");
            skipWhile.ForEach(x => { Console.WriteLine($"\tId = {x?.Id}, \t LinkId = {x?.LinkId}"); });
        }
Exemple #45
0
        /// <summary>
        /// Parse robots.txt from a specific prettyURL.
        /// Assumes robots.txt is properly formatted.
        /// </summary>
        /// <param name="prettyURL"></param>
        /// <param name="robotsContent"></param>
        /// <returns>A regex to determine if a prettyURL is disallowed.</returns>
        private Regex CalcRobotRegexForDomain(PrettyURL url, IEnumerable<string> robotsContent)
        {
            if (CachedRegexes.ContainsKey(url.GetDomain) && DateTime.Now - CachedRegexes[url.GetDomain].Item1 < MaxAge)
            {
                return CachedRegexes[url.GetDomain].Item2;
            }

            regexCalcWatch.Restart();

            // No restrictions
            // 
            if (robotsContent == null || robotsContent.Count() == 0)
            {
                return new Regex(@"@.");
            }

            // Find what is disallowed.
            var disallow = robotsContent.SkipWhile(s => !Regex.IsMatch(s, @"User-Agent: \*", RegexOptions.IgnoreCase)) // Start from user agent *.
                .TakeWhile(s => !string.IsNullOrWhiteSpace(s)) // Read until blank line (where allow/disallow hopefully ends).
                .Skip(1) // Skip the user agent string.
                .Where(s => s.StartsWith("Disallow")) // We only need disallowed stuff.
                .Select(s => s.Split(':').Last().Trim()); // Select the disallowed stuff.

            if (disallow.Count() == 0)
            {
                return new Regex(@"$.");
            }

            // Build the regex string
            StringBuilder regPattern = new StringBuilder(url + "(" + disallow.First());
            foreach (var s in disallow.Skip(1))
            {
                regPattern.Append('|');
                //regPattern.Append(prettyURL);
                regPattern.Append(s);
            }
            regPattern.Append(')');
            regPattern.Replace("*", ".*").Replace(".", "\\.").Replace("+", "\\+");

            CachedRegexes[url.GetDomain] = new Tuple<DateTime, Regex>(DateTime.Now, new Regex(regPattern.ToString()));

            regexCalcWatch.Stop();
            regexCalcTimes[url.GetDomain] = (int)regexCalcWatch.Elapsed.TotalMilliseconds;

            return CachedRegexes[url.GetDomain].Item2;
        }
        private GameObject GetFirstMatchingObject(IEnumerable<IWord> words)
        {
            var with = words.FirstOrDefault(w => w.Word == "with");
            if (with != null)
            {
                words.Substitute(with, new With());
            }

            var afterWith = words.SkipWhile(w => w.Word != "with").Skip(1);
            if (afterWith.Any() && gameState.GetObject(afterWith.ElementAt(0).Word) != null )
            {

                var withObject = gameState.GetObject(afterWith.ElementAt(0).Word);
                if (withObject != null)
                    return withObject;
            }

            return words.Select(word => gameState.GetObject(word.Word)).FirstOrDefault(gotObject => gotObject != null);
        }
Exemple #47
0
 public static Maybe<TypeDescriptor> FindTypeDescriptorAndSibling(
     string name,
     IEnumerable<OptionSpecification> specifications,
     StringComparer comparer)
 {
     var info =
         specifications.SingleOrDefault(a => name.MatchName(a.ShortName, a.LongName, comparer))
             .ToMaybe()
             .Map(
                 first =>
                     {
                         var descr = TypeDescriptor.Create(first.TargetType, first.Max);
                         var next = specifications
                             .SkipWhile(s => s.Equals(first)).Take(1)
                             .SingleOrDefault(x => x.IsValue()).ToMaybe()
                             .Map(second => TypeDescriptor.Create(second.TargetType, second.Max));
                         return descr.WithNextValue(next);
                     });
     return info;
 }
Exemple #48
0
 /// <summary>
 /// Filter strackframes by assembly filter
 /// </summary>
 /// <param name="stackFrames"></param>
 /// <returns></returns>
 private static IEnumerable<StackFrameWithIndex> FilterBySkipAssembly(IEnumerable<StackFrameWithIndex> stackFrames)
 {
     //skip while in "skip" assemlbl
     stackFrames = stackFrames.SkipWhile(p => SkipAssembly(p.StackFrame));
     return stackFrames;
 }
Exemple #49
0
        private IEnumerable<ISprint> ToSprintList(IEnumerable<object> items)
        {
            // もし先頭にTaskが書かれてたら無所属なので除外
            var seekedSprint = items.SkipWhile(x => (x is ISprint) == false).ToArray();
            // 残りが無かったらおしまい
            if (seekedSprint.Any() == false)
            {
                yield break;
            }

            // 今回処理するSprintを取り出し
            var sprint = seekedSprint.First() as Sprint;
            // 次のSprintまでに書かれているTaskを取り出し
            var tasks = seekedSprint.Skip(1).TakeWhile(x => x is ITaskItem).OfType<ITaskItem>().ToArray();
            // Sprintに追加
            tasks.ForEach(sprint.AddTask);
            // 返す
            yield return sprint;

            var tails = items.Where(x => x != sprint).Where(x => tasks.Any(y => y == x) == false).ToArray();
            // 残りを再帰で処理
            var result = ToSprintList(tails);
            foreach (var item in result)
            {
                yield return item;
            }
        }
        public PropertyEntity Parse(TypedEntity typedEntity, string name, IEnumerable<XElement> elements)
        {
            XElement declarationElement = (from el in elements
                                           where el.Name == "div" &&
                                                 el.Attribute("class") != null &&
                                                 el.Attribute("class").Value == "declaration_indent"
                                           select el).FirstOrDefault();

            XElement discussionElement = (from el in elements
                                          where el.Name == "h5" && el.Value.Trim() == "Discussion"
                                          select el).FirstOrDefault();

            XElement availabilityElement = (from el in elements
                                            let term = el.Descendants("dt").FirstOrDefault()
                                            let definition = el.Descendants("dd").FirstOrDefault()
                                            where el.Name == "dl" &&
                                                  term != null &&
                                                  term.Value.Trim() == "Availability"
                                            select definition).FirstOrDefault();

            String signature = declarationElement.TrimAll();

            // Extract abstract
            List<String> summary = new List<String>();
            IEnumerable<XElement> abstractElements = elements.SkipWhile(el => el.Name != "p").TakeWhile(el => el.Name == "p");
            foreach (XElement element in abstractElements)
            {
                String line = element.TrimAll();
                if (!String.IsNullOrEmpty(line))
                {
                    summary.Add(line);
                }
            }

            // Extract discussion
            if (discussionElement != null)
            {
                IEnumerable<XElement> discussionElements = discussionElement.ElementsAfterSelf().TakeWhile(el => el.Name == "p");
                foreach (XElement element in discussionElements)
                {
                    String line = element.TrimAll();
                    if (!String.IsNullOrEmpty(line))
                    {
                        summary.Add(line);
                    }
                }
            }

            // Get the availability
            String minAvailability = "MISSING";
            if (availabilityElement != null)
            {
                minAvailability = CommentHelper.ExtractAvailability(availabilityElement.TrimAll());
            }

            // Extract property's attribute
            List<String> attributes = new List<String>();
            int attributesStart = signature.IndexOf('(');
            int attributesEnd = signature.IndexOf(')');
            if (attributesStart > 0 && attributesEnd > attributesStart)
            {
                String attributesAll = signature.Substring(attributesStart + 1, attributesEnd - attributesStart - 1);
                attributes.AddRange(attributesAll.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(attr => attr.Trim()));
            }
            int typeStart = attributesEnd > 0 ? (attributesEnd + 1) : "@property".Length;
            int typeEnd = signature.LastIndexOf(name);
            string returnType = (typeStart > 0 && typeEnd > typeStart) ? signature.Substring(typeStart, typeEnd - typeStart).Trim() : "MISSING";

            // Is the property readonly ?
            bool readOnly = attributes.Contains("readonly");

            // Is there an explicit getter
            String getterSelector = attributes.Find(a => a.Contains("getter"));
            if (getterSelector != null)
            {
                getterSelector = getterSelector.Substring(getterSelector.IndexOf('=') + 1);
            }
            else
            {
                getterSelector = name;
            }

            // Alter the name
            name = name.UpperCaseFirstLetter();

            // Is there an explicit setter
            String setterSelector = attributes.Find(a => a.Contains("setter"));
            if (setterSelector != null)
            {
                setterSelector = setterSelector.Substring(setterSelector.IndexOf('=') + 1);
            }
            else
            {
                setterSelector = "set" + name + ":";
            }

            bool isOut, isByRef, isBlock;
            String type = this.TypeManager.ConvertType(returnType, out isOut, out isByRef, out isBlock, this.Logger);

            PropertyEntity propertyEntity = new PropertyEntity();
            propertyEntity.MinAvailability = minAvailability;
            propertyEntity.Name = getterSelector.UpperCaseFirstLetter();
            propertyEntity.Static = false;
            propertyEntity.Summary = summary;
            propertyEntity.Type = type;

            propertyEntity.Getter = new MethodEntity();
            propertyEntity.Getter.Signature = signature;
            propertyEntity.Getter.Selector = getterSelector;

            if (readOnly)
            {
                propertyEntity.Setter = null;
            }
            else
            {
                propertyEntity.Setter = new MethodEntity();
                propertyEntity.Setter.Signature = signature;
                propertyEntity.Setter.Selector = setterSelector;
            }

            return propertyEntity;
        }
Exemple #51
0
 private IEnumerable<HtmlNode> AdvanceToNextEvent(IEnumerable<HtmlNode> nodes)
 {
     return nodes.SkipWhile(x => !isTitleNode(x));
 }
        /// <summary>Find the phase shift between an input signal and the zero-phase expected signal.
        /// The phase shift is found by shifting the reference signal and finding the shift where the difference between 
        /// the input and the reference is at minimum.</summary>
        /// <param name="inputSignal"> Input signal whos phase we want to find</param>
        /// <param name="zeroPhasedSignal"> Zero phase reference signal.</param>
        /// <param name="binsInPeriod"> The expected preiod of the input signal in bins.</param>
        /// <param name="startShift"> The intitial shift to check.</param>
        /// <param name=endShift"> The final shift to check.</param>
        /// <remarks>The function assume that the zero phase signal start @ a global minimum!
        /// Positive shift value shift the shifted signal right  (negative value shift to the left).</remarks>
        public static PhaseData FindBinPhaseByShift(IEnumerable<double> inputSignal, IEnumerable<double> zeroPhasedSignal, int binsInPeriod, int startShift, int endShift, bool showDebugWindow)
        {
            try
            {
                double tmpMin = inputSignal.Min();
                double[] tmpSignal = inputSignal.SkipWhile(x => x != tmpMin).ToArray();
                int skippedBins = inputSignal.Count() - tmpSignal.Count();
                if (skippedBins > (inputSignal.Count() - binsInPeriod))
                {
                    //skippedBins = skippedBins - binsInPeriod;
                }

                double differenceSum, minDifferenceSum;
                int minDifferencePhase = 0;
                int phaseShiftIndex = 0;
                double[] sig = inputSignal.ToArray();
                double[] refSig = zeroPhasedSignal.ToArray();

                minDifferenceSum = double.PositiveInfinity;
                int shift;
                int i;
                try
                {
                    for (shift = startShift; shift <= endShift; shift++)
                    {
                        differenceSum = 0;
                        for (i = 0; i < binsInPeriod; i++)
                        {
                            phaseShiftIndex = skippedBins + shift + i;
                            phaseShiftIndex = phaseShiftIndex % inputSignal.Count();
                            phaseShiftIndex = (phaseShiftIndex < 0) ? phaseShiftIndex + binsInPeriod : phaseShiftIndex;
                            phaseShiftIndex = (phaseShiftIndex >= binsInPeriod) ? phaseShiftIndex - binsInPeriod : phaseShiftIndex;
                            differenceSum += Math.Abs(sig[phaseShiftIndex] - refSig[i]);
                        }
                        if (differenceSum < minDifferenceSum)
                        {
                            minDifferencePhase = shift;
                            minDifferenceSum = differenceSum;
                        }
                    }

                }
                catch (Exception ex)
                {

                    string s = ex.Message;
                }
                PhaseData phaseData = new PhaseData((skippedBins + minDifferencePhase), binsInPeriod, minDifferenceSum / binsInPeriod);

                int totalPhase = skippedBins + minDifferencePhase;
                if (totalPhase < 0)
                {
                    totalPhase += inputSignal.Count();
                }
                double[] shiftedSig = new double[binsInPeriod];
                for (i = 0; i < binsInPeriod; i++)
                {
                    int phaseIdx = (i + totalPhase) % sig.Length;
                    phaseIdx = (phaseIdx > sig.Length) ? phaseIdx - sig.Length : phaseIdx;
                    phaseIdx = (phaseIdx < 0) ? phaseIdx + sig.Length : phaseIdx;
                    if (phaseIdx >= sig.Length)
                    {
                        phaseIdx = phaseIdx - sig.Length;
                    }
                    shiftedSig[i] = sig[phaseIdx];
                }
                if (showDebugWindow)
                {
                    SharedCode.DebugHelper.MatlabFigure tmp = new SharedCode.DebugHelper.MatlabFigure("ref", zeroPhasedSignal.ToArray());
                    tmp.AddPlot("phased", shiftedSig, true);
                    tmp.Show();
                }
                return phaseData;
            }
            catch (Exception ex)
            {
                string s = ex.Message;
                throw new Exception("Find phase fail - " + ex.Message);
            }
        }
        public MethodEntity Parse(TypedEntity typedEntity, String selector, IEnumerable<XElement> elements)
        {
            MethodEntity methodEntity = new MethodEntity();

            XElement declarationElement = (from el in elements
                                           where el.Name == "div" &&
                                                 el.Attribute("class") != null &&
                                                 el.Attribute("class").Value == "declaration_indent"
                                           select el).FirstOrDefault();

            XElement parameterElement = (from el in elements
                                         where el.Name == "div" &&
                                               el.Attribute("class") != null &&
                                               el.Attribute("class").Value == "param_indent"
                                         select el).FirstOrDefault();

            XElement returnValueElement = (from el in elements
                                           where el.Name == "h5" && el.Value.Trim() == "Return Value"
                                           select el).FirstOrDefault();

            //XElement discussionElement = (from el in elements
            //                              where el.Name == "h5" && el.Value.Trim() == "Discussion"
            //                              select el).FirstOrDefault();

            XElement availabilityElement = (from el in elements
                                            let term = el.Descendants("dt").FirstOrDefault()
                                            let definition = el.Descendants("dd").FirstOrDefault()
                                            where el.Name == "dl" &&
                                                  term != null &&
                                                  term.Value.Trim() == "Availability"
                                            select definition).FirstOrDefault();

            methodEntity.Selector = selector;
            methodEntity.Name = GetMethodName(methodEntity);

            methodEntity.Signature = declarationElement.TrimAll();
            methodEntity.Signature = methodEntity.Signature.TrimEnd(';');

            methodEntity.Static = methodEntity.Signature.StartsWith("+");

            // Extract abstract
            IEnumerable<XElement> abstractElements = elements.SkipWhile(el => el.Name != "p").TakeWhile(el => el.Name == "p");
            foreach (XElement element in abstractElements)
            {
                String line = element.TrimAll();
                if (!String.IsNullOrEmpty(line))
                {
                    methodEntity.Summary.Add(line);
                }
            }

            //// Extract discussion
            //if (discussionElement != null)
            //{
            //    IEnumerable<XElement> discussionElements = discussionElement.ElementsAfterSelf().TakeWhile(el => el.Name == "p");
            //    foreach (XElement element in discussionElements)
            //    {
            //        String line = element.TrimAll();
            //        if (!String.IsNullOrEmpty(line))
            //        {
            //            methodEntity.Summary.Add(line);
            //        }
            //    }
            //}

            // Extract return type
            MethodSignatureEnumerator signatureEnumerator = new MethodSignatureEnumerator(methodEntity.Signature);
            if (signatureEnumerator.MoveNext())
            {
                methodEntity.ReturnType = this.TypeManager.ConvertType(signatureEnumerator.Current.TrimAll(), this.Logger);
            }
            else
            {
                methodEntity.ReturnType = "Id";
            }

            // Extract parameter type and name
            MethodParametersEnumerator parameterTypesEnumerator = new MethodParametersEnumerator(methodEntity.Signature, false);
            MethodParametersEnumerator parameterNamesEnumerator = new MethodParametersEnumerator(methodEntity.Signature, true);
            while (parameterTypesEnumerator.MoveNext() && parameterNamesEnumerator.MoveNext())
            {
                MethodParameterEntity parameterEntity = new MethodParameterEntity();
                bool isOut, isByRef, isBlock;
                parameterEntity.Type = this.TypeManager.ConvertType(parameterTypesEnumerator.Current, out isOut, out isByRef, out isBlock, this.Logger);
                parameterEntity.IsOut = isOut;
                parameterEntity.IsByRef = isByRef;
                parameterEntity.IsBlock = isBlock;
                parameterEntity.Name = parameterNamesEnumerator.Current.Trim();
                methodEntity.Parameters.Add(parameterEntity);
            }

            if (methodEntity.Parameters.Count > 0 && parameterElement != null)
            {
                XElement termList = parameterElement.Descendants("dl").FirstOrDefault();
                if (termList != null)
                {
                    IEnumerable<XElement> dtList = from el in termList.Elements("dt") select el;
                    IEnumerable<XElement> ddList = from el in termList.Elements("dd") select el;

                    if (dtList.Count() == ddList.Count())
                    {
                        // Iterate over definitions
                        for (int i = 0; i < dtList.Count(); i++)
                        {
                            String term = dtList.ElementAt(i).TrimAll();
                            //String summary = ddList.ElementAt(i).TrimAll();
                            IEnumerable<String> summaries = ddList.ElementAt(i).Elements("p").Select(p => p.Value.TrimAll());

                            // Find the parameter
                            MethodParameterEntity parameterEntity = methodEntity.Parameters.Find(p => String.Equals(p.Name, term));
                            if (parameterEntity != null)
                            {
                                //parameterEntity.Summary.Add(summary);
                                foreach (string sum in summaries)
                                {
                                    parameterEntity.Summary.Add(sum);
                                }
                            }
                        }
                    }
                }
            }

            // Fix the name only after looking for the documentation
            for (int i = 0; i < methodEntity.Parameters.Count; i++)
            {
                methodEntity.Parameters[i].Name = this.TypeManager.ConvertName(methodEntity.Parameters[i].Name);
            }

            // Get the summary for return type
            if (!String.Equals(methodEntity.ReturnType, "void", StringComparison.OrdinalIgnoreCase) && returnValueElement != null)
            {
                IEnumerable<XElement> returnTypeElements = returnValueElement.ElementsAfterSelf().TakeWhile(el => el.Name == "p");
                methodEntity.ReturnsDocumentation = String.Empty;
                foreach (XElement element in returnTypeElements)
                {
                    String line = element.TrimAll();
                    if (!String.IsNullOrEmpty(line))
                    {
                        methodEntity.ReturnsDocumentation += line;
                    }
                }
            }

            // Get the availability
            if (availabilityElement != null)
            {
                methodEntity.MinAvailability = CommentHelper.ExtractAvailability(availabilityElement.TrimAll());
            }

            return methodEntity;
        }
        public static NoSpaceExpression Produce(IEnumerable<Symbol> symbols)
        {
            // nospace-expression = open-parenthesis expression close-parenthesis
            //         / numerical-constant
            //         / prefix-operator expression
            //         / expression infix-operator expression
            if (!symbols.Any())
            {
                return null;
            }

            // expression, infix-operator, expression
            var z = symbols.Rollup(0,
                (t, d) => {
                    if (t is OpenParenthesis)
                    {
                        return d + 1;
                    }
                    if (t is ClosedParenthesis)
                    {
                        return d - 1;
                    }
                    return d;
                }
            );
            var symbolsWithIndex = symbols.Select((s, i) => new
                {
                    Symbol = s,
                    Index = i,
                });
            var z2 = symbolsWithIndex.Zip(z, (v1, v2) => new
                {
                    SymbolWithIndex = v1,
                    Depth = v2,
                });
            var operatorList = z2.Where(x =>
                x.Depth == 0 &&
                x.SymbolWithIndex.Index != 0 &&
                InfixOperator.Produce(x.SymbolWithIndex.Symbol) != null
            ).ToList();
            if (operatorList.Any())
            {
                int minPrecedence = operatorList.Select(o2 =>
                    OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()]
                ).Min();
                var op = operatorList.Last(o2 =>
                    OperatorPrecedence[o2.SymbolWithIndex.Symbol.ToString()] ==
                        minPrecedence
                );
                if (op != null)
                {
                    var expressionTokenList1 = symbols.TakeWhile(t =>
                        t != op.SymbolWithIndex.Symbol);
                    Expression e1 = Expression.Produce(expressionTokenList1);
                    if (e1 == null)
                    {
                        throw new ParserException("Invalid expression");
                    }
                    var expressionTokenList2 = symbols.SkipWhile(t =>
                        t != op.SymbolWithIndex.Symbol).Skip(1);
                    Expression e2 = Expression.Produce(expressionTokenList2);
                    if (e2 == null)
                    {
                        throw new ParserException("Invalid expression");
                    }
                    InfixOperator io = new InfixOperator(op.SymbolWithIndex.Symbol);
                    return new NoSpaceExpression(e1, io, e2);
                }
            }
            if (symbols.First() is OpenParenthesis &&
                symbols.Last() is ClosedParenthesis)
            {
                Expression e = Expression.Produce(symbols.Skip(1).SkipLast(1));
                if (e != null)
                {
                    return new NoSpaceExpression(new OpenParenthesis(), e,
                        new ClosedParenthesis());
                }
            }
            NumericalConstant n = NumericalConstant.Produce(symbols);
            if (n != null)
            {
                return new NoSpaceExpression(n);
            }
            PrefixOperator p = PrefixOperator.Produce(symbols.FirstOrDefault());
            if (p != null)
            {
                Expression e = Expression.Produce(symbols.Skip(1));
                if (e != null)
                {
                    return new NoSpaceExpression(p, e);
                }
            }
            return null;
        }
Exemple #55
0
            static string ExtractMigration(IEnumerable<string> lines)
            {
                var sqlLines = lines.SkipWhile(IsPartOfComments);

                return string.Join(Environment.NewLine, sqlLines);
            }
        public FunctionEntity Parse(TypedEntity typedEntity, string name, IEnumerable<XElement> elements)
        {
            FunctionEntity functionEntity = new FunctionEntity ();

            XElement declarationElement = (from el in elements
                                           where el.Name == "div" &&
                el.Attribute ("class") != null &&
                el.Attribute ("class").Value == "declaration_indent"
                                           select el).FirstOrDefault ();
            declarationElement = declarationElement ?? (from el in elements
                                                        where el.Name == "pre"
                                                        select el).FirstOrDefault ();

            XElement parameterElement = (from el in elements
                                         where el.Name == "div" &&
                el.Attribute ("class") != null &&
                el.Attribute ("class").Value == "param_indent"
                                         select el).FirstOrDefault ();

            XElement returnValueElement = (from el in elements
                                           where el.Name == "h5" && el.Value.Trim () == "Return Value"
                                           select el).FirstOrDefault ();

            //XElement discussionElement = (from el in elements
            //                              where el.Name == "h5" && el.Value.Trim() == "Discussion"
            //                              select el).FirstOrDefault();

            XElement availabilityElement = (from el in elements
                                            let term = el.Descendants ("dt").FirstOrDefault ()
                                            let definition = el.Descendants ("dd").FirstOrDefault ()
                                            where el.Name == "dl" &&
                term != null &&
                term.Value.Trim () == "Availability"
                                            select definition).FirstOrDefault ();

            functionEntity.Name = name;

            String signature = declarationElement.TrimAll ();
            if (signature.StartsWith ("#define")) {
                this.Logger.WriteLine ("SKIPPING define statement: " + name);
                return null;
            }
            if (!signature.Contains ("(")) { // e.g. NS_DURING
                this.Logger.WriteLine ("SKIPPING non-function statement: " + name);
                return null;
            }

            // Trim down signature
            while (signature.IndexOf("  ") != -1) {
                signature = signature.Replace ("  ", " ");
            }
            functionEntity.Signature = signature;
            //Console.WriteLine("signature='" + signature + "'");

            // Extract abstract
            IEnumerable<XElement> abstractElements = elements.SkipWhile (el => el.Name != "p").TakeWhile (el => el.Name == "p");
            foreach (XElement element in abstractElements) {
                String line = element.TrimAll ();
                if (!String.IsNullOrEmpty (line)) {
                    functionEntity.Summary.Add (line);
                }
            }

            //// Extract discussion
            //if (discussionElement != null)
            //{
            //    IEnumerable<XElement> discussionElements = discussionElement.ElementsAfterSelf().TakeWhile(el => el.Name == "p");
            //    foreach (XElement element in discussionElements)
            //    {
            //        String line = element.TrimAll();
            //        if (!String.IsNullOrEmpty(line))
            //        {
            //            methodEntity.Summary.Add(line);
            //        }
            //    }
            //}

            // Parse signature
            signature = signature.Replace ("extern", String.Empty).Trim ();
            int pos = signature.IndexOf (name);
            if (pos == -1) {
                this.Logger.WriteLine ("MISMATCH between name and declaration: " + name);
                return null;
            }

            String returnType = signature.Substring (0, pos).Trim ();
            int paramsIndex = pos + name.Length;
            int paramsLength = signature.IndexOf(')') + 1 - paramsIndex; // Stop before getting to function body
            String parameters = signature.Substring (paramsIndex, paramsLength).Trim ();
            parameters = parameters.Trim (';', '(', ')').Trim();
            if (parameters != "void") {
                foreach (string parameter in parameters.Split(new []{','}, StringSplitOptions.RemoveEmptyEntries)) {
                    String parameterType = "NOTYPE";
                    String parameterName = "NONAME";

                    //Console.WriteLine("parameter='" + parameter + "'");
                    Match r = PARAMETER_REGEX.Match (parameter);
                    if (r.Success) {
                        parameterType = r.Groups [2].Value.Trim ();
                        parameterName = r.Groups [3].Value.Trim ();
                    } else if (parameter.Trim () == "...") {
                        parameterType = "params Object[]";
                        parameterName = "values";
                    } else {
                        this.Logger.WriteLine ("FAILED to parse parameter: " + parameter);
                        return null;
                    }

                    MethodParameterEntity parameterEntity = new MethodParameterEntity ();
                    bool isOut, isByRef, isBlock;
                    parameterEntity.Type = this.TypeManager.ConvertType (parameterType, out isOut, out isByRef, out isBlock, this.Logger);
                    parameterEntity.IsOut = isOut;
                    parameterEntity.IsByRef = isByRef;
                    parameterEntity.IsBlock = isBlock;
                    parameterEntity.Name = TypeManager.ConvertName(parameterName);
                    functionEntity.Parameters.Add (parameterEntity);
                }
            }

            // Extract return type
            functionEntity.ReturnType = this.TypeManager.ConvertType (returnType, this.Logger);

            if (functionEntity.Parameters.Count > 0 && parameterElement != null) {
                XElement termList = parameterElement.Descendants ("dl").FirstOrDefault ();
                if (termList != null) {
                    IEnumerable<XElement> dtList = from el in termList.Elements ("dt") select el;
                    IEnumerable<XElement> ddList = from el in termList.Elements ("dd") select el;

                    if (dtList.Count () == ddList.Count ()) {
                        // Iterate over definitions
                        for (int i = 0; i < dtList.Count(); i++) {
                            String term = dtList.ElementAt (i).TrimAll ();
                            //String summary = ddList.ElementAt(i).TrimAll();
                            IEnumerable<String> summaries = ddList.ElementAt (i).Elements ("p").Select (p => p.Value.TrimAll ());

                            // Find the parameter
                            MethodParameterEntity parameterEntity = functionEntity.Parameters.Find (p => String.Equals (p.Name, term));
                            if (parameterEntity != null) {
                                //parameterEntity.Summary.Add(summary);
                                foreach (string sum in summaries) {
                                    parameterEntity.Summary.Add (sum);
                                }
                            }
                        }
                    }
                }
            }

            // Fix the name only after looking for the documentation
            for (int i = 0; i < functionEntity.Parameters.Count; i++) {
                functionEntity.Parameters [i].Name = this.TypeManager.ConvertName (functionEntity.Parameters [i].Name);
            }

            // Get the summary for return type
            if (!String.Equals (functionEntity.ReturnType, "void", StringComparison.OrdinalIgnoreCase) && returnValueElement != null) {
                IEnumerable<XElement> returnTypeElements = returnValueElement.ElementsAfterSelf ().TakeWhile (el => el.Name == "p");
                functionEntity.ReturnsDocumentation = String.Empty;
                foreach (XElement element in returnTypeElements) {
                    String line = element.TrimAll ();
                    if (!String.IsNullOrEmpty (line)) {
                        functionEntity.ReturnsDocumentation += line;
                    }
                }
            }

            // Get the availability
            if (availabilityElement != null) {
                functionEntity.MinAvailability = CommentHelper.ExtractAvailability (availabilityElement.TrimAll ());
            }

            return functionEntity;
        }
Exemple #57
0
 protected IEnumerable<string[]> SplitByBoundary(IEnumerable<string> texts, params string[] separators)
 {
     Func<string, bool> predicate = t => separators.Contains(t) == false;
     while (texts.Any())
     {
         var bound = texts.TakeWhile(predicate).ToArray();
         yield return bound;
         texts = texts.SkipWhile(predicate).Skip(1);
     }
 }
        public EnumerationEntity Parse(TypedEntity typedEntity, String name, IEnumerable<XElement> elements)
        {
            EnumerationEntity enumerationEntity = new EnumerationEntity ();

            XElement declarationElement = (from el in elements
                                           where el.Name == "div" &&
                el.Attribute ("class") != null &&
                el.Attribute ("class").Value == "declaration_indent"
                                           select el).FirstOrDefault ();

            XElement parameterElement = (from el in elements
                                         where el.Name == "div" &&
                el.Attribute ("class") != null &&
                el.Attribute ("class").Value == "param_indent"
                                         select el).FirstOrDefault ();

            //XElement discussionElement = (from el in elements
            //                              where el.Name == "h5" && el.Value.Trim() == "Discussion"
            //                              select el).FirstOrDefault();

            XElement availabilityElement = (from el in elements
                                            let term = el.Descendants ("dt").FirstOrDefault ()
                                            let definition = el.Descendants ("dd").FirstOrDefault ()
                                            where el.Name == "dl" &&
                term != null &&
                term.Value.Trim () == "Availability"
                                            select definition).FirstOrDefault ();

            String declaration = declarationElement.TrimAll ();
            String type = "NOTYPE";
            String values = String.Empty;

            bool result = this.SplitEnumeration (declaration, ref name, ref type, ref values);
            if (!result) {
                return null;
            }

            enumerationEntity.Name = name;
            enumerationEntity.BaseType = type;
            enumerationEntity.Namespace = "MISSING";

            // Extract abstract
            IEnumerable<XElement> abstractElements = elements.SkipWhile (el => el.Name != "p").TakeWhile (el => el.Name == "p");
            foreach (XElement element in abstractElements) {
                String line = element.TrimAll ();
                if (!String.IsNullOrEmpty (line)) {
                    enumerationEntity.Summary.Add (line);
                }
            }

            //// Extract discussion
            //if (discussionElement != null)
            //{
            //    IEnumerable<XElement> discussionElements = discussionElement.ElementsAfterSelf().TakeWhile(el => el.Name == "p");
            //    foreach (XElement element in discussionElements)
            //    {
            //        String line = element.TrimAll();
            //        if (!String.IsNullOrEmpty(line))
            //        {
            //            enumerationEntity.Summary.Add(line);
            //        }
            //    }
            //}

            // Parse the values
            string[] pairs = values.Split (new []{','}, StringSplitOptions.RemoveEmptyEntries);
            foreach (string pair in pairs) {
                if (String.Equals (pair.TrimAll (), String.Empty)) {
                    continue;
                }

                String key;
                String value = String.Empty;
                if (pair.IndexOf ('=') != -1) {
                    string[] parts = pair.Split (new []{'='}, StringSplitOptions.RemoveEmptyEntries);
                    key = parts [0].Trim ();
                    value = parts [1].Trim ();
                } else {
                    key = pair.Trim ();
                }

                // Add a new value
                EnumerationValueEntity enumerationValueEntity = new EnumerationValueEntity ();
                enumerationValueEntity.Name = key;

                if (value.Length == 6 && value.StartsWith ("'") && value.EndsWith ("'")) {
                    String v = value.Trim ('\'');
                    enumerationValueEntity.Value = "0x" + FourCharToInt (v).ToString ("X8");
                } else {
                    enumerationValueEntity.Value = value;
                }

                enumerationEntity.Values.Add (enumerationValueEntity);
            }

            XElement termList = parameterElement != null ? parameterElement.Descendants ("dl").FirstOrDefault () : null;
            if (termList != null) {
                IEnumerable<XElement> dtList = from el in termList.Elements ("dt") select el;
                IEnumerable<XElement> ddList = from el in termList.Elements ("dd") select el;

                if (dtList.Count () == ddList.Count ()) {
                    // Iterate over definitions
                    for (int i = 0; i < dtList.Count(); i++) {
                        String term = dtList.ElementAt (i).TrimAll ();
                        //String summary = ddList.ElementAt(i).TrimAll();
                        IEnumerable<String> summaries = ddList.ElementAt (i).Elements ("p").Select (p => p.Value.TrimAll ());

                        // Find the parameter
                        EnumerationValueEntity enumerationValueEntity = enumerationEntity.Values.Find (p => String.Equals (p.Name, term));
                        if (enumerationValueEntity != null) {
                            foreach (string sum in summaries) {
                                enumerationValueEntity.Summary.Add (sum);
                            }
                        }
                    }
                }
            }

            // Get the availability
            if (availabilityElement != null) {
                enumerationEntity.MinAvailability = CommentHelper.ExtractAvailability (availabilityElement.TrimAll ());
            }

            return enumerationEntity;
        }
Exemple #59
0
        string ChooseSong( IEnumerable<string> songs )
        {
            if (!songs.Any())
                return null;

            if (Game.Settings.Sound.Shuffle)
                return songs.Random(Game.CosmeticRandom);

            return songs.SkipWhile(m => m != CurrentSong)
                .Skip(1).FirstOrDefault() ?? songs.FirstOrDefault();
        }
        public static float PlatformPathDistance(IEnumerable<GameObject> path, GameObject platform)
        {
            var remainingPath = path.SkipWhile(x => x != platform).ToArray();

            float dist = 0f;
            for (int i = 0; i < remainingPath.Count () - 1; i++) {
                dist += remainingPath [i].Distance (remainingPath [i + 1]);
            }

            return dist;
        }