diff --git a/include/ranges/generated.hpp b/include/ranges/generated.hpp
index 72ed7d7..4fdadac 100644
--- a/include/ranges/generated.hpp
+++ b/include/ranges/generated.hpp
@@ -17,11 +17,30 @@ template <std::invocable F> struct generated_iterator {
   using difference_type = std::ptrdiff_t;
 
   value_type value{};
-  F generator{};
+  F generator;
 
+  // TODO: make 1 constructor that generates a value, move/copy value in all
+  // other constructors
   generated_iterator() = default;
-  generated_iterator(F gen) : generator(gen), value(gen()) {}
-  generated_iterator(F &&gen) : generator(std::move(gen)), value(gen()) {}
+  explicit generated_iterator(F &&gen)
+      : generator(std::move(gen)), value(gen()) {}
+
+  generated_iterator(const generated_iterator &other)
+      : generator(other.generator), value(other.value) {}
+  generated_iterator(generated_iterator &&other)
+      : generator(std::move(other.generator)), value(std::move(other.value)) {}
+
+  auto operator=(const generated_iterator &other) -> generated_iterator & {
+    generator = other.generator;
+    value = other.value;
+    return *this;
+  }
+
+  auto operator=(generated_iterator &&other) -> generated_iterator & {
+    generator = std::move(other.generator);
+    value = std::move(other.value);
+    return *this;
+  }
 
   auto generate_new_value() -> void { value = generator(); }
 
@@ -47,13 +66,14 @@ template <std::invocable F> struct generated_iterator {
 
 template <std::invocable F>
 class generated_view : rg::view_interface<generated_view<F>> {
-  F generator = {};
+  detail::generated_iterator<F> iter_{};
 
 public:
   constexpr generated_view() = default;
-  constexpr generated_view(F generator) : generator(std::move(generator)) {}
+  constexpr generated_view(F generator)
+      : iter_(detail::generated_iterator(std::move(generator))) {}
 
-  constexpr auto begin() const { return detail::generated_iterator(generator); }
+  constexpr auto begin() const { return iter_; }
   constexpr auto end() const { return std::unreachable_sentinel; }
 };
 
diff --git a/src/main.cc b/src/main.cc
index 5ac8364..6bfb804 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -61,16 +61,23 @@ auto test_enumerate_view() {
 }
 
 auto test_generated_view() {
-  const auto random =
-      util::views::from([] {
-        return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY"
-            [std::rand() %
-             std::strlen(
-                 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY")];
-      }) |
-      std::views::take(10) | util::views::collect<std::string>;
+  {
+    const auto view = util::views::from([] { return 's'; });
+    auto it = std::ranges::begin(view);
 
-  util::println("random string: {}", random);
+    util::assert_eq(*it, *it);
+    util::assert_eq(*it, 's');
+  }
+
+  {
+    auto count = 0;
+    const auto view = util::views::from([&] { return count++; });
+    auto it = std::ranges::begin(view);
+
+    util::assert_eq(*it, *it);
+    util::assert_ne(*it++, *it++);
+    util::assert_ne(*it + 1, *++it);
+  }
 }
 
 auto test_collect() {