message: update collection methods
  changes the methods like first(), last() and random()
diff: @@ -11,19 +11,36 @@ export class Collection<K = string, V = any> extends Map<K, V> {
  }
  /** Get first value in Collection */
  - first(): V {
  - return this.values().next().value
  + first(): V | undefined;
  + first(amount: number): V[];
  + first(amount?: number): V | V[] | undefined {
  + if (typeof amount === 'undefined') return this.values().next().value
  + if (amount < 0) return this.last(amount * -1)
  + amount = Math.min(this.size, amount)
  + const iter = this.values()
  + return Array.from({ length: amount }, (): V => iter.next().value)
  }
  /** Get last value in Collection */
  - last(): V {
  - return [...this.values()][this.size - 1]
  + last(): V | undefined;
  + last(amount: number): V[];
  + last(amount?: number): V | V[] | undefined {
  + const arr = this.array()
  + if (typeof amount === 'undefined') return arr[arr.length - 1]
  + if (amount < 0) return this.first(amount * -1)
  + if (!amount) return []
  + return arr.slice(-amount)
  }
  /** Get a random value from Collection */
  - random(): V {
  - const arr = [...this.values()]
  - return arr[Math.floor(Math.random() * arr.length)]
  + random(): V;
  + random(amount: number): V[];
  + random(amount?: number): V | V[] {
  + let arr = this.array()
  + if (typeof amount === 'undefined') return arr[Math.floor(Math.random() * arr.length)]
  + if (arr.length === 0 || !amount) return []
  + arr = arr.slice()
  + return Array.from({ length: amount }, (): V => arr.splice(Math.floor(Math.random() * arr.length), 1)[0])
  }
  /** Find a value from Collection using callback */
  