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())) { }
}
}