 
   """
   @spec take_while(Enumerable.t, (element -> as_boolean(term))) :: t
-  def take_while(enumerable, f) do
-    Lazy[enumerable: enumerable,
-         fun: fn(f1, nesting) ->
-           fn(entry, { acc, true }) ->
-             if f.(entry) do
-               { f1.(entry, acc), true }
-             else
-               throw { :stream_lazy, nesting, acc }
-             end
-           end
-         end,
-         acc: true]
+  def take_while(enum, f) do
+    lazy enum, fn(f1) ->
+      fn(entry, acc) ->
+        if f.(entry) do
+          f1.(entry, acc)
+        else
+          throw { :stream_lazy, hd(acc) }
+        end
+      end
+    end
   end
 
   @doc """

        try do
          f1.(x, y)
        catch
          { :stream_lazy, nesting, rest } ->
            throw({ :stream_flat_map, nesting, rest })
        end
      end)
    catch
      { :stream_flat_map, nesting, rest } ->
        throw({ :stream_lazy, nesting, rest })
    end
  end



  """
  @spec drop(Enumerable.t, non_neg_integer) :: t
  def drop(enum, n) when n >= 0 do
    lazy enum, n, fn(f1) ->
      fn
        _entry, [h,n|t] when n > 0 ->
          [h,n-1|t]
        entry, [h,n|t] ->
          [h|t] = f1.(entry, [h|t])
          [h,n|t]
      end
    end
  end

  @doc """
