class Lookbook::EntityTreeBuilder

def call

def call
  root_node = TreeNode.new
  entities.each do |entity|
    current_node = root_node
    path_segments = parse_segments(entity.logical_path)
    path_segments.each.with_index(1) do |segment, i|
      name, position_prefix = segment
      content = entity if entity.depth == i # entities are always on the leaf nodes
      current_node.add_child(name, content, position: position_prefix) unless current_node.has_child?(name)
      current_node = current_node.get_child(name)
      if content && content.type == :preview
        content.visible_examples.each do |example|
          current_node.add_child(example.name, example)
        end
      end
    end
  end
  root_node
end

def entities

def entities
  include_hidden ? @entities : @entities.select(&:visible?)
end

def initialize(entities, include_hidden: false)

def initialize(entities, include_hidden: false)
  @entities = entities.to_a
  @include_hidden = include_hidden
end

def parse_segments(path)

def parse_segments(path)
  path.split("/").map do |segment|
    unless segment.start_with?(".")
      position, name = PositionPrefixParser.call(segment)
      [name, position || 10000]
    end
  end.compact
end