// const take = require('./take')
// const takeUntil = require('./takeUntil')
// const log = require('./log')
// const first = require('./first')
// const last = require('./last')
require('./itrabble')

const array = ['a','b','c','d','e','f']
// const map = new Map([['a', 'a'],['b', 'b'], ['c', 'c'],['d','d'],['e','e'],['f','f']])
// const string = 'test string'

// function withConstructor(constructor){
//   return o => {
//     const proto = Object.assign({},
//       Object.getPrototypeOf(o),
//       { constructor }
//     )
//     return Object.assign(Object.create(proto), o)
//   }
// }
//
// function pipe(...fns) {
//   return x => fns.reduce((y, f) => f(y), x)
// }

// export default function Itrabble(context){
//   if(!this || this.constructor !== Itrabble) return new Itrabble(context)
//   this.context = context
//   this[Symbol.iterator] = function*(){
//     for(let val of context) yield val
//   }
// }
//
// Object.defineProperty(Object.prototype, 'itrabble', {
//   get: function(){
//     return Itrabble(this)
//   }
// })

//
// function takeIterable(n, iterable){
//   return Object.assign({
//     [Symbol.iterator]: () => {
//       const iterator = iterable[Symbol.iterator]()
//
//       return {
//         next: () => {
//           let { done, value } = iterator.next()
//           done = done || n-- <= 0
//           return {
//             done,
//             value: done ? undefined : value
//           }
//         }
//       }
//     }
//   }, Itrabble)
// }
//
// function firstIterable(iterable){
//   const iterator = iterable[Symbol.iterator]()
//   return iterator.next().value
// }
//
// function untilIterable(fn, iterable) {
//   return Object.assign({
//     [Symbol.iterator]: () => {
//       const iterator = iterable[Symbol.iterator]()
//
//       return {
//         next: () => {
//           let { done, value } = iterator.next()
//           done = done || fn(value)
//           return {
//             done,
//             value: done ? undefined : value
//           }
//         }
//       }
//     }
//   }, Itrabble)
// }
//
// function filterWithIterable(fn, iterable){
//   return Object.assign({
//     [Symbol.iterator]: () => {
//       const iterator = iterable[Symbol.iterator]()
//
//       return {
//         next: () => {
//           do {
//             var { done, value } = iterator.next()
//           } while (!done && !fn(value))
//           return { done, value }
//         }
//       }
//     }
//   }, Itrabble)
// }
//
// function keysIterable(iterable){
//   return Object.assign({
//     [Symbol.iterator]: () => {
//       const iterator = iterable[Symbol.iterator]()
//
//       return {
//         next: () => {
//           const { done, value: [key] } = iterator.next()
//           return { done, value: key }
//         }
//       }
//     }
//   }, Itrabble)
// }
//
// // const makeItrabble = iteratee => pipe(
// //   firstable,
// //   withConstructor(makeItrabble)
// // )(iteratee)
//
// const Itrabble = {
//   take(n = 1) {
//     return takeIterable(n, this)
//   },
//   takeUntil(fn) {
//     return untilIterable(fn, this)
//   },
//   filterWith(fn) {
//     return filterWithIterable(fn, this)
//   },
//   first() {
//     return firstIterable(this)
//   },
//   keys() {
//     return keysIterable(this)
//   },
//   toArray() {
//     return Array.from(this)
//   },
//   toMap() {
//     return new Map(this)
//   },
//   toObject() {
//     const proto = Object.assign({}, Object.getPrototypeOf(this))
//     return Object.assign(Object.create(proto), this)
//   },
//   toStr() {
//     return String(...this)
//   },
//   log() {
//     console.log(this)
//     return this
//   },
// }
//
// Object.assign(Object.prototype, Itrabble)
// Object.assign(Array.prototype, Itrabble)
// Object.assign(Map.prototype, Itrabble)
// Object.assign(String.prototype, Itrabble)

// array.take(1)
let ary = array.itrabble.takeWhile(x => x !== 'e')
console.log(ary)

@@ -363,2154 +363,8 @@
 g'%0A%0A
-// function withConstructor(constructor)%7B%0A//   return o =%3E %7B%0A//     const proto = Object.assign(%7B%7D,%0A//       Object.getPrototypeOf(o),%0A//       %7B constructor %7D%0A//     )%0A//     return Object.assign(Object.create(proto), o)%0A//   %7D%0A// %7D%0A//%0A// function pipe(...fns) %7B%0A//   return x =%3E fns.reduce((y, f) =%3E f(y), x)%0A// %7D%0A%0A// export default function Itrabble(context)%7B%0A//   if(!this %7C%7C this.constructor !== Itrabble) return new Itrabble(context)%0A//   this.context = context%0A//   this%5BSymbol.iterator%5D = function*()%7B%0A//     for(let val of context) yield val%0A//   %7D%0A// %7D%0A//%0A// Object.defineProperty(Object.prototype, 'itrabble', %7B%0A//   get: function()%7B%0A//     return Itrabble(this)%0A//   %7D%0A// %7D)%0A%0A//%0A// function takeIterable(n, iterable)%7B%0A//   return Object.assign(%7B%0A//     %5BSymbol.iterator%5D: () =%3E %7B%0A//       const iterator = iterable%5BSymbol.iterator%5D()%0A//%0A//       return %7B%0A//         next: () =%3E %7B%0A//           let %7B done, value %7D = iterator.next()%0A//           done = done %7C%7C n-- %3C= 0%0A//           return %7B%0A//             done,%0A//             value: done ? undefined : value%0A//           %7D%0A//         %7D%0A//       %7D%0A//     %7D%0A//   %7D, Itrabble)%0A// %7D%0A//%0A// function firstIterable(iterable)%7B%0A//   const iterator = iterable%5BSymbol.iterator%5D()%0A//   return iterator.next().value%0A// %7D%0A//%0A// function untilIterable(fn, iterable) %7B%0A//   return Object.assign(%7B%0A//     %5BSymbol.iterator%5D: () =%3E %7B%0A//       const iterator = iterable%5BSymbol.iterator%5D()%0A//%0A//       return %7B%0A//         next: () =%3E %7B%0A//           let %7B done, value %7D = iterator.next()%0A//           done = done %7C%7C fn(value)%0A//           return %7B%0A//             done,%0A//             value: done ? undefined : value%0A//           %7D%0A//         %7D%0A//       %7D%0A//     %7D%0A//   %7D, Itrabble)%0A// %7D%0A//%0A// function filterWithIterable(fn, iterable)%7B%0A//   return Object.assign(%7B%0A//     %5BSymbol.iterator%5D: () =%3E %7B%0A//       const iterator = iterable%5BSymbol.iterator%5D()%0A//%0A//       return %7B%0A//         next: () =%3E %7B%0A//           do %7B%0A//             var %7B done, value %7D = iterator.next()%0A//           %7D while (!done && !fn(value))%0A//           return %7B done, value %7D%0A//         %7D%0A//       %7D%0A//     %7D%0A//   %7D, Itrabble)%0A// %7D%0A//
 %0A// 
@@ -711,26 +711,24 @@
 abble)%0A// %7D%0A
-//
 %0A// // const
@@ -1560,204 +1560,8 @@
 / %7D%0A
-//%0A// Object.assign(Object.prototype, Itrabble)%0A// Object.assign(Array.prototype, Itrabble)%0A// Object.assign(Map.prototype, Itrabble)%0A// Object.assign(String.prototype, Itrabble)%0A%0A// array.take(1)
 %0Alet

remove lots of outdated comments