Amplía
Illuminate\Support\Collectioncon operaciones ternarias declarativas que mantienen los pipelines legibles, performantes y auditables.
Las macros se registran en el TernaryLogicServiceProvider durante el boot y quedan disponibles en cualquier Collection (y LazyCollection cuando aplica). Se apoyan en los helpers globales y TernaryLogicService, garantizando coherencia en controladores, jobs y pipelines de datos.
| Macro | Retorno | Propósito |
|---|---|---|
ternaryConsensus() |
TernaryState |
Unificar votos/estados |
ternaryMajority() |
TernaryState |
Mayoría simple |
whereTernaryTrue() |
Collection |
Filtrar elementos TRUE |
whereTernaryFalse() |
Collection |
Filtrar elementos FALSE |
whereTernaryUnknown() |
Collection |
Filtrar elementos UNKNOWN |
ternaryWeighted(array $weights) |
TernaryState |
Decisión ponderada |
ternaryMap(callable $callback) |
TernaryVector |
Transformaciones normalizadas |
ternaryScore() |
int |
Métrica balanceada (+1/0/-1) |
allTernaryTrue() |
bool |
Puerta AND |
anyTernaryTrue() |
bool |
Puerta OR |
partitionTernary() |
array<Collection> |
Divide en tres subconjuntos |
ternaryGate(array $options) |
TernaryState |
AND/OR/XOR/consensus/weighted |
- Normaliza cada item con
ternary()y usaTernaryLogicService::consensus. - Ideal para boards de aprobación o health checks multinodo.
- Mayoría simple sin pesos; empate ->
UNKNOWN. - Recomendado en clusters o failover distribuidos.
- Combina
data_get+ternary()para arrays u objetos. - Firma:
whereTernaryTrue(string $key)(análogos parafalse/unknown).
- Decisiones con pesos; acepta arreglos asociativos.
- Falta de pesos -> valor 1.
- Con
['report' => true]retornaTernaryDecisionReport.
- Similar a
map, pero obliga normalización y devuelveTernaryVector. - Permite encadenar
sum,weighted,encodesin salir del contexto ternario.
- Traduce estados a +1/0/-1 y suma.
- Útil para dashboards, scoring y thresholds.
- Operan sobre toda la colección; aceptan callback opcional (
fn ($item) => $item->state).
- Retorna array con claves
'true','false','unknown', cada una una Collection. - Ideal para paneles, exportaciones o reprocesos incrementales.
- Aplica operador configurable (
and,or,xor,consensus,weighted). - Puede recibir closure con
TernaryVectorpara lógica custom.
- Pipelines:
map -> ternaryMap -> ternaryGatemantiene el flujo declarativo. - Aggregates DDD: expone métodos que devuelven
Collection+ macros para componer decisiones. - Jobs: serializa instantáneas con
ternaryMap()->encoded()para replays.
- Normaliza datos externos antes de aplicar macros.
- Documenta las claves usadas en
whereTernary*. - Evita mezclar múltiples operadores en un mismo
ternaryGate; extrae helpers.
- Usa
collect([...])con estados explícitos (TernaryState::true()etc.). - Para macros basadas en claves, trabaja con DTOs o arrays.
- Usa
tap+ snapshots al probarternaryMap.
- Prepara logs agregando
map(fn ($item) => [$item->id, ternary($item->state)]). - Exporta
ternaryMap()->toBits()para analizar regresiones en pruebas de carga.
Las macros convierten collections en una DSL ternaria, preservando claridad incluso con grandes volúmenes de reglas y estados.