/// <summary>
        ///     Count how many neighbours of the specific cell are alive.
        ///     There are total 8 neighbours for a specific cell
        /// </summary>
        /// <param name="cell"> Cell for which neighbours needs to be find </param>
        /// <param name="grid"> Grid which contains all cell information </param>
        /// <returns> Retruns the info of all neighbours </returns>
        public IEnumerable<ICell> RetrieveNeighbours(ICell cell, IGrid grid)
        {
            if (cell == null || grid == null) return null;
            var neighbours = new List<ICell>();
            var currCellPosition = cell.Position;

            //CalculateDiagonalTopLeftNeighbour
            currCellPosition.Row = cell.Position.Row - 1;
            currCellPosition.Column = cell.Position.Column - 1;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateTopNeighbour
            currCellPosition.Row = cell.Position.Row - 1;
            currCellPosition.Column = cell.Position.Column;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateDiagonalTopRightNeighbour
            currCellPosition.Row = cell.Position.Row - 1;
            currCellPosition.Column = cell.Position.Column + 1;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateLeftNeighbour
            currCellPosition.Row = cell.Position.Row;
            currCellPosition.Column = cell.Position.Column - 1;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateRightNeighbour
            currCellPosition.Row = cell.Position.Row;
            currCellPosition.Column = cell.Position.Column + 1;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateDiagonalBottomLeftNeighbour
            currCellPosition.Row = cell.Position.Row + 1;
            currCellPosition.Column = cell.Position.Column - 1;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateBottomNeighbour
            currCellPosition.Row = cell.Position.Row + 1;
            currCellPosition.Column = cell.Position.Column;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            //CalculateDiagonalBottomRightNeighbour
            currCellPosition.Row = cell.Position.Row + 1;
            currCellPosition.Column = cell.Position.Column + 1;
            if (IsValidIndex(currCellPosition, grid)) neighbours.Add(grid.GetCurrentCellInfo(currCellPosition));

            return neighbours;
        }