#pragma once

// size_t
#include <stddef.h>

class Node {
public:
  virtual ~Node() noexcept = default;

  virtual void init() noexcept = 0;
  virtual void update(unsigned long deltaMillis);
};

class NodeList {
public:
  virtual ~NodeList() noexcept = default;

  virtual size_t size() const noexcept = 0;
  
  virtual Node* get(size_t index) noexcept {
    return nullptr;
  }

  virtual Node const* get(size_t index) const noexcept {
    return const_cast<NodeList*>(this)->get(index);
  }
};

class AbstractNode : public Node {
public:
  void init() noexcept override;
  void update(unsigned long deltaMillis) noexcept override;

protected:
  virtual NodeList& getChildren() noexcept = 0;
};