public static function mergeAll()

in src/api-gen/DataMerger.php [48:107]


  public static function mergeAll(vec<Documentable> $in): vec<Documentable> {
    /* We start by throwing any documentables with parents (e.g. methods
     * have a class as a parent), as we need to de-dupe the parents first;
     * the children are de-duped as part of that process, so we can extract
     * them from the parents after */
    $top_level = $in
      |> Vec\filter(
        $$,
        $d ==> $d['parent'] === null &&
          !(
            $d['definition'] is ScannedType ||
            $d['definition'] is ScannedNewtype
          ),
      )
      |> Dict\group_by($$, $item ==> self::getMergeKey($item))
      |> Vec\map(
        $$,
        $items ==> {
          $first = C\firstx($items);
          $rest = Vec\drop($items, 1);
          if (C\is_empty($rest)) {
            return $first;
          }
          $merged = $first;
          foreach ($rest as $item) {
            $merged = self::mergePair($merged, $item);
          }
          return $merged;
        },
      );

    $methods = $top_level
      |> Vec\map(
        $$,
        $parent ==> {
          $def = $parent['definition'];
          if ($def is ScannedClassish) {
            // Type refinement
            $parent['definition'] = $def;
            return $parent;
          }
          return null;
        },
      )
      |> Vec\filter_nulls($$)
      |> Vec\map(
        $$,
        $parent ==> Vec\map(
          $parent['definition']->getMethods(),
          $method ==> shape(
            'definition' => $method,
            'parent' => $parent['definition'],
            'sources' => $parent['sources'],
          ),
        ),
      )
      |> Vec\flatten($$);
    return Vec\concat($top_level, $methods)
      |> Vec\sort_by($$, $d ==> $d['definition']->getName());
  }