public NoiseGenerator(long seed, double persistence, int levels, int[] size, bool smooth, Interpolation interpolation)
        {
            this.seed = seed;

            if (persistence < 0.0 || persistence > 1.0)
            {
                throw new ArgumentOutOfRangeException(nameof(persistence));
            }

            this.persistence = persistence;

            if (levels <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(levels));
            }

            this.levels = levels;

            this.persistences = Enumerable.Range(0, this.levels)
                                .Select(l => Math.Pow(persistence, l))
                                .ToArray();
            this.scale = this.persistences.Sum();

            this.smooth = smooth;

            if (size == null)
            {
                throw new ArgumentNullException(nameof(size));
            }
            else if (size.Length == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(size));
            }

            this.size       = Array.ConvertAll(size, s => s);
            this.dimensions = this.size.Length;

            this.levelSizes = new int[this.levels][];
            for (var level = 0; level < this.levels; level++)
            {
                this.levelSizes[level] = new int[this.dimensions];
                for (var i = 0; i < this.dimensions; i++)
                {
                    this.levelSizes[level][i] = this.size[i] * (1 << level);
                }
            }

            this.interpolation = interpolation ?? throw new ArgumentNullException(nameof(interpolation));
            this.levelsCache   = new SplayTreeDictionary <long[], Array[]>(CacheKeyComparer.Instance);
        }
 public TiedList(SplayTreeDictionary <TKey, TValue> tree, int version, IList <T> backingList)
 {
     this.tree        = tree ?? throw new ArgumentNullException(nameof(tree));
     this.version     = version;
     this.backingList = backingList ?? throw new ArgumentNullException(nameof(backingList));
 }