Complete the solution. It should try to retrieve the value of the array at the index provided. If the index is out of the array's max bounds then it should return the default value instead. 

Example:
```Haskell
solution [1..3] 1 1000 `shouldBe` 2
solution [1..5] (10) 1000 `shouldBe` 1000
-- negative values work as long as they are not out of the length bounds
solution [1..3] (-1) 1000 `shouldBe` 3
solution [1..3] (-5) 1000 `shouldBe` 1000
solution [1..3] (-3) 1000 `shouldBe` 1
solution [1..5] (-3) 1000 `shouldBe` 3
-- for Haskell default value will always be a (random) number, not a character.
```

```python
data = ['a', 'b', 'c']
solution(data, 1, 'd') # should == 'b'
solution(data, 5, 'd') # should == 'd'

# negative values work as long as they aren't out of the length bounds
solution(data, -1, 'd') # should == 'c'
solution(data, -5, 'd') # should == 'd'
```

Source: codewars | Difficulty: EASY
Tags: Fundamentals

Data structures

Starter code: def solution(items, index, default_value):
	

Solutions:
def solution(items, index, default_value):
	try:
		return items[index]
	except IndexError:
		return default_value


def solution(items, index, default_value):
	return items[index] if -len(items) <= index < len(items) else default_value


def solution(items, index, default_value):
	try:
		return items[index]
	except LookupError:
		return default_value


def solution(items, index, default_value):
	print((items, index, default_value))
	if index >= -len(items) and index < len(items):
		return items[index]
	else:
		return default_value


def solution(items: list, index: int, default_value):
	try:
		return items[index]
	except IndexError:
		return default_value


solution = lambda a, i, v: (v, a[i % len(a)])[abs(i) <= len(a)]


def solution(items, index, default_value):
	return items[index] if abs(index + 0.5) + 0.5 <= len(items) else default_value