using System;
using System.Collections.Generic;
using System.Linq;

namespace EuclideanDistance
{
	/// <summary>
	/// Double extensions.
	/// </summary>
	public static class DoubleExtensions
	{
		/// <summary>
		/// Euclideans the distance.
		/// </summary>
		/// <returns>
		/// The distance.
		/// </returns>
		/// <param name='pointA'>
		/// Point a.
		/// </param>
		/// <param name='pointB'>
		/// Point b.
		/// </param>
		public static double EuclideanDistance(this IEnumerable<double> pointA, IEnumerable<double> pointB)
		{
			// Make sure the dimensions are the same.
			if (pointA.Count() != pointB.Count())
			{
				throw new ArgumentOutOfRangeException("Dimensions do not match");
			}

			// Iterate through each point and create the vector.
			var vectors = new List<double>();
			for (int i = 0; i < pointA.Count(); i++)
			{
				vectors.Add(Math.Pow((pointA.ElementAt(i) + pointB.ElementAt(i)), 2));
			}

			// Return the sqare root of the sum of vectors.
			return Math.Sqrt(vectors.Sum());
		}

		/// <summary>
		/// Tos the point.
		/// </summary>
		/// <returns>
		/// The point.
		/// </returns>
		/// <param name='point'>
		/// Point.
		/// </param>
		public static string ToPoint<T>(this IEnumerable<T> point)
		{
			return string.Format("({0})", string.Join(",", point));
		}
	}
}