-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathValue.php
More file actions
116 lines (97 loc) · 2.93 KB
/
Value.php
File metadata and controls
116 lines (97 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
declare(strict_types=1);
/**
* You may not change or alter any portion of this comment or credits
* of supporting developers from this source code or any supporting source code
* which is considered copyrighted (c) material of the original comment or credit authors.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/**
* @copyright 2000-2026 XOOPS Project (https://xoops.org/)
* @license GNU GPL 2.0 or later (https://www.gnu.org/licenses/gpl-2.0.html)
* @author XOOPS Development Team
*/
namespace Xoops\Helpers\Utility;
use Closure;
use Countable;
/**
* Value resolution and inspection helpers.
*
* Provides tools for resolving lazy values, checking emptiness,
* null-safe access, and memoization.
*/
final class Value
{
/**
* Resolve a value — if it's a Closure, call it; otherwise return it.
*/
public static function value(mixed $value, mixed ...$args): mixed
{
return $value instanceof Closure ? $value(...$args) : $value;
}
/**
* Determine if a value is "blank" (null, empty string, empty countable).
*
* Numeric values and booleans are never blank.
*/
public static function blank(mixed $value): bool
{
if ($value === null) {
return true;
}
if (is_string($value)) {
return trim($value) === '';
}
if (is_numeric($value) || is_bool($value)) {
return false;
}
if ($value instanceof Countable) {
return count($value) === 0;
}
return empty($value);
}
/**
* Determine if a value is "filled" (not blank).
*/
public static function filled(mixed $value): bool
{
return !self::blank($value);
}
/**
* Wrap a value in an Optional for null-safe property and method access.
*/
public static function optional(mixed $value): Optional
{
return new Optional($value);
}
/**
* Execute a callback once and cache the result for subsequent calls.
*
* The callback is identified by its object identity (spl_object_id),
* so the same Closure instance will return the cached result.
*/
public static function once(Closure $callback): mixed
{
/** @var array<int, mixed> $cache */
static $cache = [];
$key = spl_object_id($callback);
if (!array_key_exists($key, $cache)) {
$cache[$key] = $callback();
}
return $cache[$key];
}
/**
* Return a MissingValue sentinel for absence detection.
*
* Use with Arr::get() to distinguish "key not found"
* from "key exists but value is null".
*/
public static function missing(): MissingValue
{
static $instance = null;
return $instance ??= new MissingValue();
}
}