/*
A bunch of slice helper functions
All of these modify the original slice
*/
package main

import (
	"fmt"
)

func main() {
	arr := []int{1,2,3,4,5,6,7,8,9,0}
	a, arr := pop(arr, 4)
	fmt.Println("Popped   : ", a, arr)
	a, arr = shift(arr)
	fmt.Println("Shifted  : ", a, arr)
	arr = unshift(arr, 10) 
	fmt.Println("Unshifted: ", arr)
	arr = reverse(arr)
	fmt.Println("Reversed : ", arr)
	arr = maps(arr, func (r int) int {
		return r * 2
	})
	fmt.Println("Mapped   : ", arr)
	a = reduce(arr, func (prev int, now int) int {
		return prev + now
	})
	fmt.Println("Reduced  : ", a)
}

func pop(arr []int, x int) (int, []int) {
	n := arr[x]
	return n, append(arr[:x], arr[x+1:]...)[:len(arr)-1]
}

func shift(arr []int) (int, []int) {
	n := arr[0]
	return n, copy(arr[1:])
}

func unshift(arr []int, x int) []int {
	return append([]int{x}, arr...)
}

func reverse(arr []int) []int {
	var narr []int
	for i := len(arr) - 1; i >= 0; i-- {
		narr = append(narr, arr[i])
	}
	return narr
}

func maps(arr []int, f func(int) int) []int {
	for i, v := range arr {
		arr[i] = f(v)
	}
	return arr	
}

func reduce(arr []int, f func(int, int) int) int {
	var r int
	for _, v := range arr {
		r = f(r, v)
	}
	return r
}