Iterator.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2020, Matthew Olsson <mattco@serenityos.org>
  3. * Copyright (c) 2022-2023, Linus Groh <linusg@serenityos.org>
  4. * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/Function.h>
  10. #include <AK/Optional.h>
  11. #include <LibJS/Runtime/Completion.h>
  12. #include <LibJS/Runtime/Object.h>
  13. #include <LibJS/Runtime/Value.h>
  14. namespace JS {
  15. // 7.4.1 Iterator Records, https://tc39.es/ecma262/#sec-iterator-records
  16. struct IteratorRecord {
  17. GCPtr<Object> iterator; // [[Iterator]]
  18. Value next_method; // [[NextMethod]]
  19. bool done { false }; // [[Done]]
  20. };
  21. class Iterator : public Object {
  22. JS_OBJECT(Iterator, Object);
  23. public:
  24. static NonnullGCPtr<Iterator> create(Realm&, Object& prototype, IteratorRecord iterated);
  25. IteratorRecord const& iterated() const { return m_iterated; }
  26. private:
  27. Iterator(Object& prototype, IteratorRecord iterated);
  28. explicit Iterator(Object& prototype);
  29. IteratorRecord m_iterated; // [[Iterated]]
  30. };
  31. enum class IteratorHint {
  32. Sync,
  33. Async,
  34. };
  35. enum class StringHandling {
  36. IterateStrings,
  37. RejectStrings,
  38. };
  39. ThrowCompletionOr<IteratorRecord> get_iterator_from_method(VM&, Value, NonnullGCPtr<FunctionObject>);
  40. ThrowCompletionOr<IteratorRecord> get_iterator(VM&, Value, IteratorHint);
  41. ThrowCompletionOr<IteratorRecord> get_iterator_direct(VM&, Object&);
  42. ThrowCompletionOr<IteratorRecord> get_iterator_flattenable(VM&, Value, StringHandling);
  43. ThrowCompletionOr<NonnullGCPtr<Object>> iterator_next(VM&, IteratorRecord const&, Optional<Value> = {});
  44. ThrowCompletionOr<GCPtr<Object>> iterator_step(VM&, IteratorRecord const&);
  45. ThrowCompletionOr<bool> iterator_complete(VM&, Object& iterator_result);
  46. ThrowCompletionOr<Value> iterator_value(VM&, Object& iterator_result);
  47. Completion iterator_close(VM&, IteratorRecord const&, Completion);
  48. Completion async_iterator_close(VM&, IteratorRecord const&, Completion);
  49. NonnullGCPtr<Object> create_iterator_result_object(VM&, Value, bool done);
  50. ThrowCompletionOr<MarkedVector<Value>> iterator_to_list(VM&, IteratorRecord const&);
  51. using IteratorValueCallback = Function<Optional<Completion>(Value)>;
  52. Completion get_iterator_values(VM&, Value iterable, IteratorValueCallback callback);
  53. }