using System; using System.Collections.Generic; using System.Linq; using Chernobyl.Creation; using Chernobyl.Generation.Old; namespace Chernobyl.Generation { /// /// The representation of a data set which has some recurring data. /// public interface IPattern : IComparable { /// /// The pattern's data set. /// IEnumerable Data { get; } /// /// The average value of the . /// double Average { get; } } /// /// Represents multiple instances as a single . /// public interface ICompositePattern : IPattern { /// /// The this instance is composed of. /// IEnumerable Patterns { get; } } /// /// A simple that just takes its data from the constructor parameter. /// public class BasicPattern : IPattern { /// public BasicPattern(IEnumerable data) { Data = data; } /// /// Creates an with a single value for its data. /// public BasicPattern(double data) : this(new[] {data}) { Average = Data.Average(); } /// public int CompareTo(IPattern other) { return Average.CompareTo(other.Average); } /// public IEnumerable Data { get; } /// public double Average { get; } } /// public class CompositePattern : ICompositePattern { /// public CompositePattern(IEnumerable patterns) { Patterns = patterns; Average = Data.Average(); } /// public IEnumerable Data => Patterns.SelectMany(pattern => pattern.Data); /// public double Average { get; } /// public IEnumerable Patterns { get; } /// public int CompareTo(IPattern other) { return Average.CompareTo(other.Average); } } /// /// Initialization properties for creating conflicted . /// public class ConflictedPatternConfig { /// public ConflictedPatternConfig(int count) { Count = count; } /// /// The number of values to build the pattern from. The higher the value, the larger the /// pattern size. /// public int Count { get; } } /// /// Creates a conflicted . /// public interface IConflictedPatternFactory : IFactory { } /// /// An that creates a . /// public class ConflictedPatternFactory : FuncFactory, IConflictedPatternFactory { /// public ConflictedPatternFactory() : base(config => Old.Pattern.BuildHierarchy(config.Count, new Random())) { } } }