app/Fact.php
private static function dateComparator(): Closure
    {
        return static function (Fact $a, Fact $b): int {
            if ($a->date()->isOK() && $b->date()->isOK()) {
                // If both events have dates, compare by date
                $ret = Date::compare($a->date(), $b->date());

                if ($ret === 0) {
                    // If dates overlap, compare by fact type
                    $ret = self::typeComparator()($a, $b);

                    // If the fact type is also the same, retain the initial order
                    if ($ret === 0) {
                        $ret = $a->sortOrder <=> $b->sortOrder;
                    }
                }

                return $ret;
            }

            // One or both events have no date - retain the initial order
            return $a->sortOrder <=> $b->sortOrder;
        };
    }
private static function dateComparator(): Closure
    {
        return static function (Fact $a, Fact $b): int {
            if ($a->date()->isOK() && $b->date()->isOK()) {
                // If both events have dates, compare by date
                $ret = Date::compare($a->date(), $b->date());

                if ($ret === 0) {
                    // If dates overlap, compare by fact type
                    $ret = self::typeComparator()($a, $b);

                    // If the fact type is also the same, retain the initial order
                    if ($ret === 0) {
                        $ret = $a->sortOrder <=> $b->sortOrder;
                    }
                }

                return $ret;
            }

            // One or both events have no date - retain the initial order
            return $a->sortOrder <=> $b->sortOrder;
        };
    }
private static function dateComparator ( ) : Closure { return static function ( Fact $ a , Fact $ b ) : int { if ( $ a -> date ( ) -> isOK ( ) && $ b -> date ( ) -> isOK ( ) ) { // If both events have dates, compare by date $ ret = Date :: compare ( $ a -> date ( ) , $ b -> date ( ) ) ; if ( $ ret === 0 ) { // If dates overlap, compare by fact type $ ret = self :: typeComparator ( ) ( $ a , $ b ) ; // If the fact type is also the same, retain the initial order if ( $ ret === 0 ) { $ ret = $ a -> sortOrder <=> $ b -> sortOrder ; } } return $ ret ; } // One or both events have no date - retain the initial order return $ a -> sortOrder <=> $ b -> sortOrder ; } ; }
Helper functions to sort facts

@return Closure
Helper functions to sort facts