<?php 
 
declare(strict_types=1); 
 
namespace { 
    if (\PHP_VERSION_ID < 70300) { 
        if (!\function_exists('is_countable')) { 
            /** 
             * @param mixed $var 
             * 
             * @return bool 
             */ 
            function is_countable($var) 
            { 
                return \is_array($var) 
                       || 
                       $var instanceof SimpleXMLElement 
                       || 
                       $var instanceof Countable 
                       || 
                       $var instanceof ResourceBundle; 
            } 
        } 
 
        if (!\function_exists('array_key_first')) { 
            /** 
             * @param array<mixed> $array 
             * 
             * @return int|string|null 
             */ 
            function array_key_first(array $array) 
            { 
                foreach ($array as $key => $value) { 
                    return $key; 
                } 
 
                return null; 
            } 
        } 
 
        if (!\function_exists('array_key_last')) { 
            /** 
             * @param array<mixed> $array 
             * 
             * @return int|string|null 
             */ 
            function array_key_last(array $array) 
            { 
                if (\count($array) === 0) { 
                    return null; 
                } 
 
                return \array_keys( 
                    \array_slice($array, -1, 1, true) 
                )[0]; 
            } 
        } 
    } 
} 
 
namespace Arrayy { 
    use Arrayy\Collection\Collection; 
    use Arrayy\TypeCheck\TypeCheckArray; 
    use Arrayy\TypeCheck\TypeCheckInterface; 
 
    if (!\function_exists('Arrayy\create')) { 
        /** 
         * Creates a Arrayy object. 
         * 
         * @param mixed $data 
         * 
         * @return Arrayy<int|string,mixed> 
         */ 
        function create($data): Arrayy 
        { 
            return new Arrayy($data); 
        } 
    } 
 
    if (!\function_exists('Arrayy\collection')) { 
        /** 
         * Creates a Collection object. 
         * 
         * @param string|TypeCheckArray|TypeCheckInterface[] $type 
         * @param array<mixed>                               $data 
         * 
         * @return Collection 
         * 
         * @template T 
         * @phpstan-param T $type 
         * @phpstan-return Collection<array-key,T> 
         */ 
        function collection($type, $data = []): Collection 
        { 
            /** @phpstan-var Collection<array-key,T> */ 
            return Collection::construct($type, $data); 
        } 
    } 
 
    /** 
     * @param array<mixed> $array 
     * @param mixed        $fallback <p>This fallback will be used, if the array is empty.</p> 
     * 
     * @return mixed|null 
     * 
     * @template TLast 
     * @template TLastFallback 
     * @phpstan-param TLast[] $array 
     * @phpstan-param TLastFallback $fallback 
     * @phpstan-return TLast|TLastFallback 
     */ 
    function array_last(array $array, $fallback = null) 
    { 
        $key_last = \array_key_last($array); 
        if ($key_last === null) { 
            return $fallback; 
        } 
 
        return $array[$key_last]; 
    } 
 
    /** 
     * @param array<mixed> $array 
     * @param mixed        $fallback <p>This fallback will be used, if the array is empty.</p> 
     * 
     * @return mixed|null 
     * 
     * @template TFirst 
     * @template TFirstFallback 
     * @phpstan-param TFirst[] $array 
     * @phpstan-param TFirstFallback $fallback 
     * @phpstan-return TFirst|TFirstFallback 
     */ 
    function array_first(array $array, $fallback = null) 
    { 
        $key_first = \array_key_first($array); 
        if ($key_first === null) { 
            return $fallback; 
        } 
 
        return $array[$key_first]; 
    } 
} 
 
 |