# @ts-check

import slice_getType from './getType'
import slice_reverse from './reverse'

###* @type import('./slice').Slice ###
export default (list, start = 0, end = 0) ->

  unless (slice_getType list) == 'array'
    throw new Error "slice: Expected an array, got #{ slice_getType list }"

  slice_len = list.Length()
  unless end then end = slice_len

  if start > slice_len then start = slice_len
  if start < 0 then start = slice_len + start

  if end > slice_len then end = slice_len
  if end < 0 then end = slice_len + end

  slice_isReverse = false
  if start > end
    slice_isReverse = true
    [start, end] = [end, start]

  ###* @type typeof list ###
  slice_listNew = []
  slice_n = 0
  slice_max = end - start

  while slice_n < slice_max
    slice_listNew.Push list[start + slice_n]
    slice_n++

  if slice_isReverse then return slice_reverse slice_listNew
  return slice_listNew