Bem-vindo à Evolution Core Library (ECL) — a solução que moderniza o Delphi e o coloca no mesmo patamar das linguagens mais avançadas de hoje, como Rust, Kotlin e Python. Se você é um desenvolvedor Delphi que ama a robustez da linguagem, mas sente falta de recursos contemporâneos como pattern matching, null safety, async/await ou programação funcional, o ECL é para você. Criado para preencher as lacunas do Delphi nativo, o ECL traz ferramentas poderosas que aumentam sua produtividade, reduzem erros e tornam seu código mais elegante e manutenível.
O Delphi é uma lenda no desenvolvimento desktop e empresarial, mas o mundo da programação evoluiu. Recursos como Option/Maybe, Result/Either, tuplas e currying — comuns em linguagens modernas — estão ausentes ou limitados no Delphi nativo. O ECL muda isso, oferecendo:
- Segurança contra
nil
: ComTOption<T>
, diga adeus aos erros de ponteiro nulo. Force o tratamento seguro de valores opcionais, como em Rust ou Haskell. - Resultados tipados: Substitua exceções caóticas por
TResultPair<S,F>
, um sistema de sucesso/falha previsível e funcional. - Pattern Matching: Use
TMatch<T>
para escrever código expressivo e substituir cadeias deif-else
, ao estilo de C# ou F#. - Assincronia simplificada: O
TScheduler
traz o poder de async/await ao Delphi, eliminando a complexidade de threads manuais. - Programação funcional: Métodos como
Map
,Filter
eReduce
emTArrayEx
,TListEx
eTStringHelperEx
tornam manipulações de coleções e strings intuitivas e concisas. - Tuplas e destruturação:
TTuple<T>
eTTuple
permitem estruturas leves como(1, 'a')
, com extração direta de valores. - Currying:
TCurrying
introduz funções parciais, comof(x)(y)
, ao estilo de Haskell ou Scala.
Por que adotar o ECL? Porque ele transforma o Delphi em uma ferramenta competitiva no desenvolvimento moderno, sem sacrificar o que você já ama na linguagem:
- Produtividade: Escreva menos código boilerplate com lambdas simplificadas, list comprehensions e flatmaps.
- Robustez: Evite bugs comuns com null safety e tratamento explícito de erros.
- Manutenibilidade: Código funcional e declarativo é mais fácil de entender e atualizar.
- Integração: O ECL se encaixa perfeitamente no ecossistema Delphi, mantendo performance e compatibilidade.
Não é apenas uma biblioteca — é uma evolução. Com o ECL, você leva o Delphi além de suas limitações, abraçando o melhor da programação atual enquanto mantém a essência que torna o Delphi único. Experimente e veja como seu próximo projeto pode ser mais rápido, seguro e elegante.
Explore a documentação abaixo para começar!
A unidade ecl.vector
introduz a estrutura TVector<T>
, um vetor dinâmico genérico que oferece uma alternativa moderna e flexível aos arrays tradicionais do Delphi. Inspirado em recursos de linguagens modernas, como listas dinâmicas e coleções genéricas, o TVector<T>
suporta manipulação eficiente de elementos com operações como adição, remoção, filtragem, mapeamento e redução, tudo isso com tipagem forte graças aos recursos genéricos do Delphi.
Principais Características:
- Capacidade dinâmica: Ajusta automaticamente o tamanho interno com fatores de crescimento e redução otimizados.
- Operadores sobrecarregados: Suporta operações como
+
(concatenar),-
(remover),in
(verificar pertinência), entre outros. - Métodos funcionais: Inclui
Filter
,Map
,Reduce
eComprehend
, trazendo paradigmas de programação funcional para o Delphi. - Iteração: Fornece um enumerador (
IVectorEnumerator<T>
) para percorrer os elementos de forma segura e idiomática. - Conversão: Permite conversões implícitas entre
TVector<T>
eTArray<T>
, além de métodos comoToArray
eAsList
.
Essa unidade é ideal para cenários que exigem coleções dinâmicas com alta flexibilidade e desempenho, como manipulação de dados em tempo real ou estruturas complexas.
uses
ecl.vector;
var
Vec: TVector<Integer>;
I: Integer;
begin
// Inicializa um vetor vazio
Vec := TVector<Integer>.Empty;
// Adiciona elementos
Vec.Add(10);
Vec.Add(20);
Vec.Add(30);
// Concatena com outro vetor usando o operador +
Vec := Vec + TVector<Integer>.Create([40, 50]);
// Filtra números pares
Vec := Vec.Filter(function(const Value: Integer): Boolean
begin
Result := Value mod 2 = 0;
end);
// Itera sobre os elementos
for I in Vec do
Writeln(I); // Saída: 10, 20, 30, 40, 50
// Reduz a soma dos elementos
Writeln(Vec.Reduce(function(Acc, Value: Integer): Integer
begin
Result := Acc + Value;
end)); // Saída: 150
end;
A unidade ecl.tuple
introduz duas estruturas de tuplas para o Delphi: TTuple
(tupla posicional) e TTuple<K>
(tupla nomeada baseada em chaves). Essas estruturas trazem o conceito de tuplas, comum em linguagens modernas como Python e C#, para o Delphi, permitindo agrupar valores heterogêneos de forma eficiente e tipada.
- Armazena uma sequência de valores (
TValue
) acessíveis por índice. - Suporta conversão implícita de/para arrays de
TValue
eVariant
. - Inclui o método
Dest
para desestruturar os valores em variáveis.
- Armazena pares chave-valor, onde as chaves são de tipo genérico
K
e os valores sãoTValue
. - Implementada com um dicionário interno (
TDictionary<K, TValue>
), acessível via interfaceITupleDict<K>
. - Permite acesso a valores por chave com tipagem forte via métodos
Get<T>
eTryGet<T>
.
Principais Características:
- Flexibilidade: Suporta valores de diferentes tipos em uma única estrutura.
- Operadores sobrecarregados: Inclui
=
e<>
para comparação de tuplas. - Conversão implícita: Facilita a integração com arrays e coleções existentes.
- Acesso tipado: Métodos genéricos para recuperar valores com segurança de tipo.
Essas tuplas são úteis para retornar múltiplos valores de funções, agrupar dados heterogêneos ou simular estruturas de dados nomeadas sem criar classes específicas.
uses
ecl.tuple;
var
PosTuple: TTuple;
NamedTuple: TTuple<String>;
Name: String;
Age: Integer;
begin
// Criando uma tupla posicional
PosTuple := TTuple.New([TValue.From('Isaque'), TValue.From(30)]);
Writeln('Nome: ', PosTuple.Get<String>(0)); // Saída: Nome: Isaque
Writeln('Idade: ', PosTuple.Get<Integer>(1)); // Saída: Idade: 30
// Desestruturando a tupla posicional
PosTuple.Dest([@Name, @Age]);
Writeln('Desestruturado - Nome: ', Name, ', Idade: ', Age);
// Saída: Desestruturado - Nome: Isaque, Idade: 30
// Criando uma tupla nomeada
NamedTuple := TTuple<String>.New(
['nome', 'idade'],
[TValue.From('Isaque'), TValue.From(30)]
);
Writeln('Nome: ', NamedTuple.Get<String>('nome')); // Saída: Nome: Isaque
Writeln('Idade: ', NamedTuple.Get<Integer>('idade')); // Saída: Idade: 30
// Verificando um valor com TryGet
if NamedTuple.TryGet<Integer>('idade', Age) then
Writeln('Idade recuperada: ', Age); // Saída: Idade recuperada: 30
end;
A unidade ecl.objects
oferece ferramentas modernas para criação e gerenciamento de objetos em Delphi, trazendo conceitos avançados como reflexão (RTTI), ponteiros inteligentes e inicialização preguiçosa (lazy loading). Ela é dividida em três componentes principais:
- Implementa a interface
IObject
para criar instâncias de classes ou interfaces dinamicamente. - Suporta construção padrão (
Create
) ou com argumentos personalizados via RTTI. - Usa um
TRttiContext
singleton para eficiência e thread-safety.
- Gerencia o ciclo de vida de objetos (
T: class
) com inicialização preguiçosa e liberação automática. - Inclui métodos como
Match
(para pattern matching) eScoped
(para execução com limpeza automática). - Thread-safe com uso de
TAutoRefLock
(baseado emTCriticalSection
).
- Permite gerenciar valores (classes ou tipos simples) com controle de mutabilidade.
- Suporta operações seguras com
Scoped
eMatch
, respeitando o estado mutável/imutável.
Principais Características:
- Reflexão Dinâmica: Criação de objetos sem necessidade de chamadas explícitas ao construtor.
- Gerenciamento Automático: Ponteiros inteligentes cuidam da alocação e liberação de recursos.
- Thread-Safety: Mecanismos de bloqueio garantem segurança em ambientes multi-thread.
- Programação Funcional: Suporte a pattern matching e escopo controlado.
Essa unidade é ideal para cenários que exigem flexibilidade na criação de objetos ou gerenciamento seguro de recursos, como sistemas multi-thread ou arquiteturas complexas.
uses
ecl.objects;
type
TMyClass = class
private
FValue: Integer;
public
constructor Create(AValue: Integer);
property Value: Integer read FValue;
end;
constructor TMyClass.Create(AValue: Integer);
begin
FValue := AValue;
end;
var
ObjFactory: IObject;
SmartPtr: TSmartPtr<TMyClass>;
MutableRef: TMutableRef<TMyClass>;
begin
// Criando uma fábrica de objetos
ObjFactory := TObjectEx.New;
// Instanciando um objeto com argumentos via RTTI
Writeln(TMyClass(ObjFactory.Factory(TMyClass, [TValue.From(42)], 'Create')).Value);
// Saída: 42
// Usando um ponteiro inteligente com lazy loading
SmartPtr := TSmartPtr<TMyClass>.Create(nil);
Writeln(SmartPtr.AsRef.Value); // Instancia automaticamente e retorna 0 (construtor padrão)
// Pattern matching com SmartPtr
Writeln(SmartPtr.Match<String>(
function: String begin Result := 'Nulo'; end,
function(AObj: TMyClass): String begin Result := AObj.Value.ToString; end
)); // Saída: 0
// Usando escopo com SmartPtr
SmartPtr.Scoped(procedure(AObj: TMyClass)
begin
Writeln('Dentro do escopo: ', AObj.Value); // Saída: Dentro do escopo: 0
end);
// Criando uma referência mutável
MutableRef := TMutableRef<TMyClass>.Create(TMyClass.Create(100), True);
MutableRef.Scoped(function(AObj: TMyClass): TValue
begin
Writeln('Antes: ', AObj.Value); // Saída: Antes: 100
Result := TValue.From<TMyClass>(TMyClass.Create(200));
end);
Writeln('Depois: ', MutableRef.AsRef.Value); // Saída: Depois: 200
end;
A unidade ecl.threading
introduz a estrutura TAsync
, que simplifica a execução de operações assíncronas em Delphi usando o framework de tarefas (TTask
). Inspirada em construções como async/await
de linguagens modernas, ela permite executar procedimentos ou funções em threads separadas, com opções para aguardar resultados, tratar erros e gerenciar o estado da tarefa de forma segura.
Principais Características:
- Execução Assíncrona: Suporta procedimentos (
TProc
) e funções (TFunc<TValue>
) em threads paralelas. - Await: Método para aguardar a conclusão da tarefa com timeout configurável e continuação opcional.
- Run/NoAwait: Inicia a execução com ou sem espera, com suporte a tratamento de erros via callback.
- Thread-Safety: Usa
TAutoLock
(baseado emTCriticalSection
) para sincronização segura. - Estado e Controle: Métodos como
Status
,Cancel
eGetId
para gerenciar a tarefa.
Essa unidade é perfeita para aplicações que precisam de concorrência, como operações demoradas em segundo plano ou integração com APIs assíncronas, mantendo o código limpo e legível.
uses
ecl.threading;
var
AsyncTask: TAsync;
FutureResult: TFuture;
begin
// Executando um procedimento assíncrono com await
AsyncTask := Async(procedure
begin
Sleep(1000); // Simula uma tarefa demorada
Writeln('Tarefa concluída!');
end);
FutureResult := AsyncTask.Await(2000); // Aguarda até 2 segundos
if FutureResult.IsSuccess then
Writeln('Sucesso: ', FutureResult.Value.AsBoolean) // Saída: Sucesso: True
else
Writeln('Erro: ', FutureResult.Error);
// Executando uma função assíncrona com resultado
AsyncTask := Async(function: TValue
begin
Sleep(500);
Result := TValue.From<Integer>(42);
end);
FutureResult := AsyncTask.Await(
procedure
begin
Writeln('Continuação após a tarefa');
end, 1000);
if FutureResult.IsSuccess then
Writeln('Resultado: ', FutureResult.Value.AsInteger); // Saída: Resultado: 42
// Executando sem esperar (NoAwait) com tratamento de erro
AsyncTask := Async(procedure
begin
Sleep(300);
raise Exception.Create('Erro simulado');
end);
AsyncTask.NoAwait(function(E: Exception): TFuture
begin
Writeln('Erro capturado: ', E.Message); // Saída: Erro capturado: Erro simulado
Result.SetOk(True);
end);
end;
A unidade ecl.stream
apresenta a classe TStreamReaderEx
, uma extensão avançada do TStreamReader
padrão do Delphi. Inspirada em paradigmas funcionais e fluxos de dados (streams) de linguagens modernas, ela oferece métodos para manipulação de linhas de texto em streams ou arquivos, como mapeamento, filtragem, redução e agrupamento, além de suporte a notificações via listeners e gerenciamento automático de recursos com TSmartPtr
.
Principais Características:
- Funcionalidades Funcionais: Inclui
Map
,Filter
,Reduce
,ForEach
,GroupBy
eComprehend
para manipulação de dados. - Gerenciamento de Recursos: Usa
TSmartPtr
para liberar automaticamente streams internos. - Listeners: Permite adicionar ouvintes para monitorar operações em tempo real.
- Flexibilidade: Suporta leitura de streams ou arquivos com várias opções de encoding e buffer.
- Métodos de Fluxo: Oferece
Skip
,Take
,Sort
,Distinct
,Concat
ePartition
para controle granular do conteúdo.
Essa classe é ideal para processar grandes volumes de dados textuais, como logs, arquivos CSV ou streams de rede, com uma API fluida e moderna.
uses
ecl.stream;
var
Reader: TStreamReaderEx;
Result: Integer;
begin
// Criando um stream reader a partir de um arquivo
Reader := TStreamReaderEx.New('example.txt');
// Adicionando um listener para monitorar operações
Reader.AddListener(procedure(const Line: String; const Operation: String)
begin
Writeln(Operation, ': ', Line);
end);
// Mapeando linhas para maiúsculas
Reader.Map(function(const Line: String): String
begin
Result := UpperCase(Line);
end);
// Filtrando linhas que começam com 'A'
Reader.Filter(function(const Line: String): Boolean
begin
Result := Line.StartsWith('A');
end);
// Reduzindo para contar caracteres
Result := Reader.Reduce(function(Acc: Integer; const Line: String): Integer
begin
Result := Acc + Length(Line);
end, 0);
Writeln('Total de caracteres: ', Result);
// Agrupando por primeira letra
var Groups := Reader.GroupBy(function(const Line: String): String
begin
Result := Line[1];
end);
for var Key in Groups.Keys do
Writeln('Grupo ', Key, ': ', Groups[Key].Count, ' linhas');
// Lendo como string final
Writeln('Conteúdo final: ', Reader.AsString);
end;
A unidade ecl.arrow.fun
apresenta o record TArrow
, uma utilidade para programação funcional em Delphi que permite criar procedimentos e funções para manipular valores (TValue
) e variáveis de forma flexível. Inspirado em conceitos como "arrows" de linguagens funcionais, o TArrow
suporta atribuições a variáveis, efeitos colaterais e recuperação de valores com conversão de tipos segura, incluindo operações com tuplas para múltiplos valores.
Principais Características:
- Procedimentos Dinâmicos: Cria
TProc
para atribuir valores a variáveis internas ou externas. - Funções com Resultado: Gera
TFunc<TValue>
para computar e retornar valores. - Suporte a Tuplas: Permite atualizar múltiplas variáveis a partir de um
Tuple
com type-safety. - Conversão de Tipos: Métodos como
Value<T>
recuperam valores com cast automático. - Gerenciamento de Estado: Armazena o último valor processado em uma variável interna (
FValue
).
Essa unidade é útil para cenários que exigem manipulação funcional de dados, como pipelines de transformação ou atribuições condicionais em fluxos de código.
uses
ecl.arrow.fun,
ecl.tuple;
var
Proc: TProc;
Func: TFunc<TValue>;
StrVar: String;
IntVar: Integer;
MultiProc: TProc<TValue>;
begin
// Criando um procedimento simples
Proc := TArrow.Fn(TValue.From('Hello'));
Proc(); // Atribui 'Hello' ao FValue interno
Writeln(TArrow.Value<String>); // Saída: Hello
// Criando uma função que retorna um valor
Func := TArrow.Result(TValue.From(42));
Writeln(Func().AsInteger); // Saída: 42
// Atribuindo a uma variável tipada
StrVar := 'Initial';
Proc := TArrow.Fn<String>(StrVar, 'Updated');
Proc(TValue.Empty); // Executa a atribuição
Writeln(StrVar); // Saída: Updated
// Atribuindo múltiplos valores com tupla
IntVar := 0;
MultiProc := TArrow.Fn([@StrVar, @IntVar], Tuple.New([TValue.From('Multi'), TValue.From(100)]));
MultiProc(TValue.Empty);
Writeln('String: ', StrVar, ', Integer: ', IntVar); // Saída: String: Multi, Integer: 100
end;
A unidade ecl.coroutine
implementa um sistema de corrotinas em Delphi, permitindo a execução cooperativa de tarefas com controle de estado e comunicação entre elas. Composta pela classe TCoroutine
e pela interface IScheduler
(implementada por TScheduler
), ela oferece uma alternativa leve à programação assíncrona tradicional, inspirada em mecanismos como generators e coroutines de linguagens modernas.
Componentes Principais:
TCoroutine
: Representa uma corrotina com estado (Active
,Paused
,Finished
), função principal (TFuncCoroutine
), e suporte a observers para notificação.IScheduler
/TScheduler
: Gerencia múltiplas corrotinas, controlando execução, suspensão, retomada e comunicação viaSend
eYield
.
Principais Características:
- Execução Cooperativa: Corrotinas cedem controle explicitamente com
Yield
, permitindo multitarefa sem threads pesados. - Comunicação: Suporta envio de valores (
Send
) e recebimento (Yield
) entre corrotinas e o scheduler. - Controle de Tempo: Permite definir intervalos de execução para cada corrotina.
- Thread-Safety: Usa
TCriticalSection
para sincronização segura. - Callbacks: Oferece eventos para início (
Started
), fim (Finished
) e tratamento de erros.
Essa unidade é ideal para cenários como simulações, pipelines de processamento ou tarefas cíclicas que requerem coordenação leve e eficiente.
uses
ecl.coroutine;
var
Scheduler: IScheduler;
Counter: Integer;
begin
Scheduler := TScheduler.New(100); // Intervalo de 100ms entre execuções
// Adicionando uma corrotina simples
Scheduler.Add('Counter', function(ASendValue, AValue: TValue): TFuture
begin
Counter := AValue.AsInteger + 1;
Writeln('Counter: ', Counter);
Result.SetOk(TValue.From(Counter));
if Counter >= 3 then
Result := TCompletion; // Finaliza a corrotina
end, TValue.From(0));
// Adicionando uma corrotina com intervalo e envio
Scheduler.Add('Sender', function(ASendValue, AValue: TValue): TFuture
begin
if not ASendValue.IsEmpty then
Writeln('Received: ', ASendValue.AsString);
Result.SetOk(TValue.From('Ping'));
end, TValue.Empty, nil, 500); // Intervalo de 500ms
// Configurando callbacks
Scheduler.Started(procedure
begin
Writeln('Scheduler iniciado!');
end).Finished(procedure
begin
Writeln('Scheduler finalizado!');
end).Run(procedure(AMessage: String)
begin
Writeln('Erro: ', AMessage);
end);
// Enviando valor e esperando
Sleep(1000);
Scheduler.Send('Sender', TValue.From('Hello'));
Sleep(1000);
Scheduler.Stop;
Writeln('Valor final do Counter: ', Counter);
end;
A unidade ecl.currying
oferece um conjunto robusto de ferramentas para programação funcional em Delphi, incluindo currying, memoização, pipelines e operações numéricas genéricas. Inspirada em linguagens como Haskell e F#, ela traz conceitos avançados como composição de funções, aplicação parcial e manipulação funcional de listas, além de suporte a tipos numéricos diversos via a interface INumeric<T>
.
Componentes Principais:
TCurrying
: Record que suporta operações curried e manipulação de valores (TValue
) com métodos comoOp
eConcat
.TPipeline<T>
: Estrutura para encadear transformações em valores de forma fluida.TMemoizedCache<T, U>
: Cache thread-safe para memoização de resultados de funções.INumeric<T>
: Interface implementada por classes comoTNumericInteger
eTNumericString
para operações numéricas genéricas.
Principais Características:
- Currying: Transforma funções multi-argumento em sequências de funções de um argumento (
Curry
,UnCurry
,Partial
). - Memoização: Otimiza funções com cache de resultados (
Memoize
). - Pipelines: Encadeia operações com
TPipeline<T>
usandoApply
,Map
eThn
. - Manipulação de Listas: Métodos como
Map
,Filter
,Fold
,GroupBy
,Zip
e mais para trabalhar comTList<T>
. - Operações Numéricas: Suporte a tipos como
Integer
,Double
,String
,Boolean
eTDateTime
viaINumeric<T>
.
Essa unidade é ideal para desenvolvedores que buscam aplicar paradigmas funcionais em Delphi, otimizando código e trabalhando com dados de maneira declarativa.
uses
ecl.currying;
var
Curried: TCurrying;
Pipeline: TPipeline<Integer>;
List: TList<Integer>;
MemoizedFib: TFunc<Integer, Integer>;
begin
// Usando currying para somar valores
Curried := TCurrying.Create(TValue.From<Integer>(5));
var AddFunc := Curried.Op<Integer>(function(X, Y: Integer): Integer begin Result := X + Y; end);
Writeln(AddFunc(3).Value<Integer>); // Saída: 8
// Criando um pipeline
Pipeline := TCurrying.Pipe<Integer>(10)
.Map<Integer>(function(X: Integer): Integer begin Result := X * 2; end)
.Thn<string>(function(X: Integer): string begin Result := 'Valor: ' + X.ToString; end);
Writeln(Pipeline.Value); // Saída: Valor: 20
// Memoizando uma função de Fibonacci
MemoizedFib := TCurrying.Memoize<Integer, Integer>(
function(N: Integer): Integer
begin
if N <= 1 then Result := N else Result := MemoizedFib(N - 1) + MemoizedFib(N - 2);
end);
Writeln(MemoizedFib(10)); // Saída: 55 (calculado rapidamente graças ao cache)
// Manipulando uma lista
List := TList<Integer>.Create;
try
List.AddRange([1, 2, 3, 4, 5]);
var Doubled := TCurrying.Map<Integer, Integer>(List, function(X: Integer): Integer begin Result := X * 2; end);
Writeln(TCurrying.ArrayToString<Integer>(Doubled.ToArray)); // Saída: 2, 4, 6, 8, 10
finally
List.Free;
end;
// Usando INumeric para operações
var Num := TNumericInteger.Create(10);
Writeln(Num.Add(5).ToString); // Saída: 15
end;
A unidade ecl.dictionary
apresenta a classe TDictEx<K, V>
, uma extensão do TDictionary<K, V>
padrão do Delphi que incorpora funcionalidades avançadas para manipulação de pares chave-valor. Inspirada em paradigmas funcionais e coleções de linguagens modernas, ela oferece métodos para filtragem, mapeamento, redução, agrupamento e mais, além de operações como rotação, interseção e exclusão.
Principais Características:
- Manipulação Funcional: Métodos como
Map
,Filter
,Reduce
eGroupBy
para transformações declarativas. - Iteração Avançada: Suporte a
ForEach
eForEachIndexed
para ações em pares chave-valor. - Ordenação e Aleatoriedade: Inclui
SortedKeys
,ShuffleKeys
eRotate
para reorganização de dados. - Operações de Conjunto:
Intersect
,Except
ePartition
para manipulação baseada em lógica de conjuntos. - Flexibilidade: Métodos como
Take
,Skip
,Slice
eFlatMap
para controle granular dos dados.
Essa classe é ideal para cenários que exigem manipulação sofisticada de dicionários, como processamento de dados, análises ou estruturas de configuração complexas.
uses
ecl.dictionary;
var
Dict: TDictEx<string, Integer>;
Filtered: TMap<string, Integer>;
Mapped: TMap<string, string>;
begin
// Criando e populando o dicionário
Dict := TDictEx<string, Integer>.Create;
try
Dict.Add('apple', 5);
Dict.Add('banana', 3);
Dict.Add('cherry', 8);
// Iterando com ForEach
Dict.ForEach(procedure(Key: string; Value: Integer)
begin
Writeln(Key, ': ', Value);
end);
// Saída: apple: 5, banana: 3, cherry: 8
// Filtrando valores maiores que 4
Filtered := Dict.Filter(function(Key: string; Value: Integer): Boolean
begin
Result := Value > 4;
end);
Writeln(Filtered.ToString); // Saída: apple=5, cherry=8
// Mapeando valores para strings
Mapped := Dict.Map<string>(function(Value: Integer): string
begin
Result := 'Qty: ' + Value.ToString;
end);
Writeln(Mapped.ToString); // Saída: apple=Qty: 5, banana=Qty: 3, cherry=Qty: 8
// Agrupando por paridade
var Groups := Dict.GroupBy<Boolean>(function(Value: Integer): Boolean
begin
Result := Value mod 2 = 0;
end);
Writeln('Pares: ', Groups[True].Count, ', Ýmpares: ', Groups[False].Count);
// Saída: Pares: 1, Ýmpares: 2
// Pegando os primeiros 2 itens
var Taken := Dict.Take(2);
Writeln(Taken.ToString); // Saída: apple=5, banana=3
finally
Dict.Free;
end;
end;
A unidade ecl.directory
apresenta o record TDirEx
, uma abstração que encapsula e aprimora as funcionalidades do TDirectory
da unidade IOUtils
do Delphi. Ele oferece métodos para listar diretórios, arquivos e entradas do sistema de arquivos, retornando resultados em um TVector<String>
para integração com outras partes da ECL. Suporta filtros, padrões de busca e opções de recursão, mantendo uma API simples e consistente.
Principais Características:
- Listagem Flexível: Métodos como
GetDirectories
,GetFiles
eGetFileSystemEntries
com várias sobrecargas. - Filtros Personalizados: Suporte a
TFilterPredicate
para filtragem baseada em condições. - Padrões de Busca: Permite especificar padrões como
*.txt
para restringir resultados. - Recursão: Opção
TSearchOption
para busca em subdiretórios. - Integração com ECL: Retorna
TVector<String>
para fácil manipulação com outras unidades.
Essa unidade é ideal para tarefas de gerenciamento de arquivos e diretórios, como varreduras de sistema, busca de arquivos específicos ou integração com pipelines de processamento de dados.
uses
ecl.directory;
var
Dirs: TVector<String>;
Files: TVector<String>;
begin
// Listando todos os diretórios em um caminho
Dirs := TDirEx.GetDirectories('C:\Example');
Writeln('Diretórios: ', Dirs.ToString);
// Saída exemplo: [C:\Example\Folder1, C:\Example\Folder2]
// Listando arquivos .txt em um diretório
Files := TDirEx.GetFiles('C:\Example', '*.txt');
Writeln('Arquivos .txt: ', Files.ToString);
// Saída exemplo: [C:\Example\file1.txt, C:\Example\file2.txt]
// Filtrando arquivos por tamanho (> 1KB) em subdiretórios
Files := TDirEx.GetFiles('C:\Example', '*.txt', TSearchOption.soAllDirectories,
function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := SearchRec.Size > 1024;
end);
Writeln('Arquivos .txt > 1KB: ', Files.ToString);
// Saída exemplo: [C:\Example\Subfolder\largefile.txt]
// Listando entradas do sistema de arquivos com filtro
var Entries := TDirEx.GetFileSystemEntries('C:\Example',
function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := Pos('test', LowerCase(SearchRec.Name)) > 0;
end);
Writeln('Entradas com "test": ', Entries.ToString);
// Saída exemplo: [C:\Example\testfolder, C:\Example\testfile.txt]
end;
A unidade ecl.dot.env
apresenta a classe TDotEnv
, uma ferramenta poderosa para gerenciamento de variáveis de ambiente em Delphi. Inspirada em bibliotecas populares como dotenv
de outras linguagens, ela permite carregar, manipular e salvar variáveis de um arquivo .env
, além de interagir com variáveis de ambiente do sistema. Suporta interpolação de variáveis, acesso tipado e fallback opcional para o sistema.
Principais Características:
- Suporte a
.env
: Carrega e salva variáveis de arquivos.env
com facilidade. - Interpolação: Resolve referências como
${VAR}
em valores de variáveis. - Acesso Tipado: Métodos como
Get<T>
,TryGet<T>
eValue<T>
para conversão segura de tipos. - Fallback do Sistema: Opção de usar variáveis de ambiente do sistema quando não encontradas no arquivo.
- Manipulação: Adiciona, atualiza e remove variáveis no arquivo ou no sistema operacional.
Essa classe é ideal para gerenciar configurações de aplicativos, como chaves de API, caminhos ou parâmetros, de forma centralizada e segura.
uses
ecl.dot.env;
var
Env: TDotEnv;
begin
// Criando uma instância e carregando .env
Env := TDotEnv.Create('.env', True);
try
// Exemplo de conteúdo do arquivo .env:
// API_KEY=abc123
// PORT=8080
// BASE_URL=http://${API_KEY}@example.com
// Acessando valores com conversão de tipo
Writeln('API Key: ', Env.Get<String>('API_KEY')); // Saída: API Key: abc123
Writeln('Port: ', Env.Get<Integer>('PORT')); // Saída: Port: 8080
// Usando interpolação
Writeln('Base URL: ', Env.Get<String>('BASE_URL')); // Saída: Base URL: http://[email protected]
// Adicionando uma nova variável
Env.Push('DEBUG', TValue.From<Boolean>(True));
Writeln('Debug: ', Env.Value<Boolean>('DEBUG')); // Saída: Debug: True
// Salvando alterações no arquivo
Env.Save;
// Obtendo com fallback
Writeln('User: ', Env.GetOr<String>('USER', 'default')); // Usa sistema ou 'default'
// Manipulando variáveis do sistema
Env.EnvCreate('TEMP_VAR', 'test');
Writeln('Temp Var: ', Env.EnvLoad('TEMP_VAR')); // Saída: Temp Var: test
Env.EnvDelete('TEMP_VAR');
finally
Env.Free;
end;
end;
A unidade ecl.list
apresenta a classe TListEx<T>
, uma extensão do TList<T>
padrão do Delphi que incorpora funcionalidades avançadas para manipulação de listas genéricas. Inspirada em paradigmas funcionais e coleções de linguagens modernas, ela oferece métodos para filtragem, mapeamento, redução, agrupamento e mais, retornando resultados em TVector<T>
para integração com a ECL, além de operações como rotação, embaralhamento e interseção.
Principais Características:
- Manipulação Funcional: Métodos como
Map
,Filter
,Reduce
,GroupBy
eComprehend
para transformações declarativas. - Iteração Avançada: Suporte a
ForEach
eForEachIndexed
para ações em elementos. - Ordenação e Aleatoriedade: Inclui
SortBy
,Shuffle
eRotate
para reorganização de elementos. - Operações de Conjunto:
Intersect
,Except
ePartition
para manipulação baseada em lógica de conjuntos. - Flexibilidade: Métodos como
Take
,Skip
,Slice
eFlatMap
para controle granular da lista.
Essa classe é ideal para cenários que exigem manipulação sofisticada de listas, como processamento de dados, ordenação personalizada ou integração com outras estruturas da ECL.
uses
ecl.list;
var
List: TListEx<Integer>;
Filtered: TVector<Integer>;
Mapped: TVector<String>;
begin
// Criando e populando a lista
List := TListEx<Integer>.Create;
try
List.AddRange([1, 2, 3, 4, 5]);
// Iterando com ForEach
List.ForEach(procedure(Value: Integer)
begin
Writeln('Item: ', Value);
end);
// Saída: Item: 1, Item: 2, Item: 3, Item: 4, Item: 5
// Filtrando valores pares
Filtered := List.Filter(function(Value: Integer): Boolean
begin
Result := Value mod 2 = 0;
end);
Writeln('Pares: ', Filtered.ToString); // Saída: Pares: [2, 4]
// Mapeando para strings
Mapped := List.Map<String>(function(Value: Integer): String
begin
Result := 'Num: ' + Value.ToString;
end);
Writeln('Mapeado: ', Mapped.ToString); // Saída: Mapeado: [Num: 1, Num: 2, Num: 3, Num: 4, Num: 5]
// Reduzindo para soma
Writeln('Soma: ', List.Reduce(function(Acc, Value: Integer): Integer
begin
Result := Acc + Value;
end, 0)); // Saída: Soma: 15
// Embaralhando a lista
List.Shuffle;
Writeln('Embaralhado: ', List.ToString); // Saída exemplo: Embaralhado: [3, 1, 5, 2, 4]
finally
List.Free;
end;
end;
A unidade ecl.map
apresenta a estrutura TMap<K, V>
, uma implementação personalizada de mapa (dicionário) genérico em Delphi que oferece uma alternativa ao TDictionary<K, V>
padrão. Construída com uma tabela de hash otimizada e suporte a operações funcionais, ela inclui métodos para manipulação avançada de pares chave-valor, como mapeamento, filtragem e iteração, com suporte a colisões via sondagem linear.
Principais Características:
- Tabela de Hash: Usa sondagem linear para resolver colisões, com controle de capacidade e rehashing.
- Manipulação Funcional: Métodos como
Map
,Filter
eForEach
para transformações declarativas. - Flexibilidade: Suporte a adição, remoção, e acesso tipado com
TryGetValue
eGetValue
. - Serialização: Oferece
ToJson
eToString
, com variantesRaw
para maior desempenho. - Iteração: Inclui enumerador personalizado para percorrer pares chave-valor.
Essa estrutura é ideal para cenários que exigem controle fino sobre mapas, como gerenciamento de configurações, caches ou dados estruturados com alta eficiência.
uses
ecl.map;
var
Map: TMap<String, Integer>;
Filtered: TMap<String, Integer>;
begin
// Criando um mapa vazio
Map := TMap<String, Integer>.Empty;
// Adicionando pares chave-valor
Map.Add('apple', 5);
Map.Add('banana', 3);
Map.Add('cherry', 8);
// Iterando com ForEach
Map.ForEach(procedure(Key: String; Value: Integer)
begin
Writeln(Key, ': ', Value);
end);
// Saída: apple: 5, banana: 3, cherry: 8
// Filtrando valores maiores que 4
Filtered := Map.Filter(function(Key: String; Value: Integer): Boolean
begin
Result := Value > 4;
end);
Writeln('Filtrado: ', Filtered.ToString); // Saída: Filtrado: apple=5 cherry=8
// Mapeando valores para o dobro
var Doubled := Map.Map(function(Value: Integer): Integer
begin
Result := Value * 2;
end);
Writeln('Dobrados: ', Doubled.ToString); // Saída: Dobrados: apple=10 banana=6 cherry=16
// Acessando um valor
Writeln('Banana: ', Map.GetValue('banana')); // Saída: Banana: 3
// Convertendo para JSON
Writeln('JSON: ', Map.ToJson); // Saída: JSON: {"apple": "5", "banana": "3", "cherry": "8"}
end;
A unidade ecl.match
apresenta a estrutura TMatch<T>
, uma implementação robusta de correspondência de padrões (pattern matching) em Delphi. Inspirada em linguagens funcionais como F# e Scala, ela permite definir casos condicionais complexos para valores genéricos, incluindo comparações de igualdade, intervalos, tipos, expressões regulares e tratamento de exceções, com suporte a guardas e resultados tipados.
Principais Características:
- Casos Diversificados: Suporta
CaseIf
,CaseEq
,CaseGt
,CaseLt
,CaseIn
,CaseIs
,CaseRange
,CaseRegex
eDefault
. - Guardas: Permite condições adicionais com
CaseIf
para filtrar casos. - Expressões Regulares: Integração com
ecl.regexlib
paraCaseRegex
. - Flexibilidade: Suporte a procedimentos (
TProc
) e funções (TFunc
) como ações, com sobrecargas para diferentes tipos. - Exceções: Inclui
TryExcept
para tratamento de erros durante a execução.
Essa estrutura é ideal para substituir cadeias de if-else
complexas, oferecendo uma abordagem declarativa e expressiva para lógica condicional em aplicações Delphi.
uses
ecl.match;
var
Match: TMatch<Integer>;
Result: TResultPair<String, String>;
begin
// Criando um padrão de correspondência
Match := TMatch<Integer>.Value(42);
// Definindo casos
Match.CaseIf(True, procedure begin Writeln('Guard passed'); end)
.CaseEq(42, procedure(Value: Integer) begin Writeln('Equals 42'); end)
.CaseGt(40, function: String begin Result := 'Greater than 40'; end)
.CaseLt(50, function(Value: Integer): String begin Result := 'Less than ' + Value.ToString; end)
.CaseRange(0, 100, procedure begin Writeln('In range 0-100'); end)
.Default(function: String begin Result := 'No match'; end);
// Executando e obtendo resultado
Result := Match.Execute<String>;
if Result.IsSuccess then
Writeln('Resultado: ', Result.ValueSuccess) // Saída: Resultado: Greater than 40
else
Writeln('Erro: ', Result.ValueFailure);
// Exemplo com regex e try-except
Match := TMatch<String>.Value('Hello123');
Match.CaseRegex('Hello\d+', procedure begin Writeln('Matches regex'); end)
.TryExcept(procedure begin Writeln('Exception handled'); end)
.Execute;
// Saída: Matches regex
end;
A unidade ecl.option
apresenta a estrutura TOption<T>
, uma implementação do padrão Option (ou Maybe) em Delphi para gerenciar valores que podem ou não estar presentes. Inspirada em linguagens como Rust e Haskell, ela oferece uma alternativa segura ao uso de nil
ou valores padrão, evitando exceções inesperadas e promovendo um estilo de programação mais funcional.
Principais Características:
- Estados:
Some(T)
para valores presentes eNone
para ausência de valor. - Acesso Seguro: Métodos como
Unwrap
,UnwrapOr
,Expect
eUnwrapOrElse
para extrair valores com controle. - Transformações: Suporte a
Map
,Filter
,AndThen
eFlatten
para manipulação funcional. - Correspondência:
Match
eIfSome
para execução condicional baseada no estado. - Integração: Converte para
TResultPair
viaOkOr
e suporta operações comoZip
eReplace
.
Essa estrutura é ideal para cenários onde valores podem ser indefinidos, como resultados de consultas, entradas opcionais ou operações que podem falhar, substituindo verificações manuais por uma API elegante e segura.
uses
ecl.option;
var
Opt: TOption<Integer>;
Result: String;
begin
// Criando um TOption com valor
Opt := TOption<Integer>.Some(42);
// Verificando estado
Writeln('IsSome: ', Opt.IsSome); // Saída: IsSome: True
Writeln('Value: ', Opt.Unwrap); // Saída: Value: 42
// Transformando com Map
var StrOpt := Opt.Map<String>(function(Value: Integer): String
begin
Result := 'Number: ' + Value.ToString;
end);
Writeln('Mapped: ', StrOpt.Unwrap); // Saída: Mapped: Number: 42
// Usando Match
Opt.Match(procedure(Value: Integer)
begin
Result := 'Some: ' + Value.ToString;
end,
procedure
begin
Result := 'None';
end);
Writeln(Result); // Saída: Some: 42
// Criando um TOption vazio
Opt := TOption<Integer>.None;
Writeln('UnwrapOr: ', Opt.UnwrapOr(0)); // Saída: UnwrapOr: 0
// Tratando ausência com Expect
try
Opt.Expect('Valor esperado não encontrado');
except
on E: Exception do
Writeln('Erro: ', E.Message); // Saída: Erro: Valor esperado não encontrado
end;
end;
A unidade ecl.result.pair
apresenta a estrutura TResultPair<S, F>
, uma implementação do padrão Result em Delphi para encapsular resultados que podem ser um sucesso (S
) ou uma falha (F
). Inspirada em linguagens como Rust e Haskell, ela oferece uma alternativa robusta ao uso de exceções ou valores nulos para representar operações que podem falhar, promovendo um estilo de programação funcional e seguro.
Principais Características:
- Estados:
Success(S)
para resultados bem-sucedidos eFailure(F)
para falhas. - Acesso Seguro: Métodos como
SuccessOrException
,FailureOrElse
,ValueSuccess
eValueFailure
para extrair valores com controle. - Transformações: Suporte a
Map
,FlatMap
,When
eReduce
para manipulação funcional dos resultados. - Exceções Personalizadas: Inclui
EFailureException<F>
eESuccessException<S>
para erros específicos ao acessar valores inválidos. - Flexibilidade: Permite combinar ações e transformações baseadas no estado do resultado.
Essa estrutura é ideal para cenários onde operações podem falhar, como chamadas de API, leitura de arquivos ou cálculos, oferecendo uma maneira clara e segura de tratar ambos os casos sem depender exclusivamente de exceções.
uses
ecl.result.pair;
var
Result: TResultPair<Integer, String>;
begin
// Criando um resultado de sucesso
Result := TResultPair<Integer, String>.Success(42);
Writeln('IsSuccess: ', Result.IsSuccess); // Saída: IsSuccess: True
Writeln('Value: ', Result.ValueSuccess); // Saída: Value: 42
// Transformando com Map
var StrResult := Result.Map<String>(function(Value: Integer): String
begin
Result := 'Number: ' + Value.ToString;
end);
Writeln('Mapped: ', StrResult.ValueSuccess); // Saída: Mapped: Number: 42
// Usando When para ação condicional
Result.When(procedure(Value: Integer) begin Writeln('Success: ', Value); end,
procedure(Error: String) begin Writeln('Failure: ', Error); end);
// Saída: Success: 42
// Criando um resultado de falha
Result := TResultPair<Integer, String>.Failure('Erro ao processar');
Writeln('IsFailure: ', Result.IsFailure); // Saída: IsFailure: True
// Tratando falha com SuccessOrElse
Writeln('SuccessOrElse: ', Result.SuccessOrElse(function: Integer begin Result := 0; end));
// Saída: SuccessOrElse: 0
// Acessando falha com exceção
try
Result.SuccessOrException;
except
on E: EFailureException<String> do
Writeln('Erro: ', E.Message); // Saída: Erro: A generic exception occurred with value Erro ao processar
end;
end;
A unidade ecl.safetry
apresenta as estruturas TSafeTry
e TSafeResult
, que oferecem uma maneira segura e funcional de executar blocos try-except-finally em Delphi. Inspirada em padrões como try
/catch
/finally
de outras linguagens, ela encapsula a execução de código potencialmente falível, retornando um resultado (TSafeResult
) que indica sucesso ou falha sem lançar exceções diretamente.
Componentes Principais:
TSafeTry
: Configura e executa um bloco try-except-finally com métodos encadeáveis (Try
,Except
,Finally
,End
).TSafeResult
: Representa o resultado da execução, contendo um valor (TValue
) em caso de sucesso ou uma mensagem de erro em caso de falha.
Principais Características:
- Encadeamento Fluente: Permite configurar try, except e finally em uma única expressão.
- Acesso Seguro: Métodos como
GetValue
,TryGetValue
eAsType<T>
para acessar o resultado com controle. - Flexibilidade: Suporta tanto procedimentos (
TProc
) quanto funções (TFunc<TValue>
) no bloco try. - Tipagem Genérica: Converte resultados para tipos específicos com
AsType<T>
.
Essa unidade é ideal para cenários onde você deseja evitar exceções não tratadas, como operações de I/O, parsing ou chamadas externas, oferecendo uma alternativa funcional e segura ao gerenciamento tradicional de erros.
uses
ecl.safetry;
var
Safe: TSafeResult;
begin
// Executando um bloco com função
Safe := &Try(function: TValue
begin
Result := TValue.From(42 div 0); // Simula uma divisão por zero
end)
.&Except(procedure(E: Exception)
begin
Writeln('Exceção capturada: ', E.Message);
end)
.&Finally(procedure
begin
Writeln('Finalizando execução');
end)
.&End;
Writeln('IsOk: ', Safe.IsOk); // Saída: IsOk: False
Writeln('Erro: ', Safe.ExceptionMessage); // Saída: Erro: Division by zero
// Executando um bloco com procedimento
Safe := &Try(procedure
begin
Writeln('Executando com sucesso');
end)
.&End;
Writeln('IsOk: ', Safe.IsOk); // Saída: IsOk: True
if Safe.TryGetValue(var Value: TValue) then
Writeln('Valor: ', Value.AsBoolean); // Saída: Valor: True
// Convertendo para tipo específico
Safe := &Try(function: TValue
begin
Result := TValue.From(123);
end)
.&End;
Writeln('Valor como Integer: ', Safe.AsType<Integer>); // Saída: Valor como Integer: 123
end;
A unidade ecl.std
é o núcleo de utilitários da Evolution Core Library (ECL), fornecendo estruturas e funções essenciais para suporte às demais unidades. Ela inclui ferramentas para manipulação de arrays (TArrayEx
), conjuntos (TSet<T>
), resultados futuros (TFuture
), streams baseados em ponteiros (TPointerStream
), e utilitários gerais (TStd
), além de definições como Tuple
e TListString
.
Componentes Principais:
TFuture
: Representa um valor futuro que pode ser sucesso ou erro.TArrayEx
: ExtendeTArray
com métodos funcionais comoMap
,Filter
,Reduce
eGroupBy
.TSet<T>
: Conjunto genérico para itens únicos com operações comoUnion
eContains
.TStd
: Classe singleton com funções utilitárias comoMin
,Max
,Split
e conversão ISO 8601.TPointerStream
: Stream baseado em ponteiros para manipulação direta de memória.
Principais Características:
- Funcionalidade: Oferece métodos funcionais para arrays e conversões de dados.
- Flexibilidade: Suporte genérico para tipos diversos em
TSet
eTArrayEx
. - Utilitários: Funções comuns como manipulação de strings, datas e memória.
Essa unidade é a base para muitas funcionalidades da ECL, sendo ideal para operações genéricas, manipulação de coleções e integração com outras partes da biblioteca.
uses
ecl.std;
var
Future: TFuture;
Set: TSet<Integer>;
ArrayEx: TArray<Integer>;
begin
// Usando TFuture
Future.SetOk(TValue.From(42));
Writeln('Future Ok: ', Future.IsOk); // Saída: Future Ok: True
Writeln('Future Value: ', Future.Ok<Integer>); // Saída: Future Value: 42
// Usando TSet
Set := TSet<Integer>.Create;
try
Set.Add(1); Set.Add(2); Set.Add(1);
Writeln('Set Count: ', Set.Count); // Saída: Set Count: 2
Writeln('Set Contains 2: ', Set.Contains(2)); // Saída: Set Contains 2: True
finally
Set.Free;
end;
// Usando TArrayEx
ArrayEx := TArrayEx.Map<Integer, String>([1, 2, 3], function(Value: Integer): String
begin
Result := 'Num: ' + Value.ToString;
end);
Writeln('Mapped Array: ', TStd.JoinStrings(ArrayEx, ', ')); // Saída: Mapped Array: Num: 1, Num: 2, Num: 3
// Usando TStd
Writeln('Min: ', TStd.Min(5, 10)); // Saída: Min: 5
Writeln('ISO Date: ', TStd.DateTimeToIso8601(Now, True)); // Saída exemplo: ISO Date: 2025-03-19T14:30:00
end;
A unidade ecl.str
oferece extensões funcionais para tipos básicos do Delphi (Char
, String
, Integer
, Boolean
, Double
, TDateTime
) por meio de record helpers. Inspirada em paradigmas funcionais, ela adiciona métodos como Map
, Filter
, Reduce
e outros, permitindo manipulações expressivas e declarativas diretamente sobre esses tipos.
Componentes Principais:
TCharHelperEx
: Métodos comoToUpper
,ToLower
,IsLetter
,IsDigit
.TStringHelperEx
: Funções funcionais (Map
,Filter
,Reduce
) e utilitários (Sort
,Reverse
,GroupBy
).TIntegerHelperEx
: Métodos comoMap
,IsEven
,IsOdd
,Times
.TBooleanHelperEx
: Métodos comoMap
,IfTrue
,IfFalse
.TFloatHelperEx
: Métodos comoMap
,Round
,ApproxEqual
.TDateTimeHelperEx
: Métodos comoMap
,AddDays
,IsPast
,ToFormat
.
Principais Características:
- Programação Funcional: Métodos como
Map
eReduce
para transformações e agregações. - Utilitários Práticos: Funções para manipulação direta de valores básicos.
- Integração: Usa
TVector
(deecl.vector
) eTDictionary
para operações avançadas.
Essa unidade é ideal para simplificar operações em tipos básicos, promovendo um código mais conciso e funcional em aplicações Delphi.
uses
ecl.str;
var
Str: String;
Vec: TVector<String>;
Int: Integer;
Date: TDateTime;
begin
// Extensões para String
Str := 'Hello123';
Writeln('Filtered: ', Str.Filter(function(C: Char): Boolean begin Result := C.IsLetter; end));
// Saída: Filtered: Hello
Writeln('Mapped: ', Str.Map(function(C: Char): Char begin Result := C.ToUpper; end));
// Saída: Mapped: HELLO123
Writeln('Sum: ', Str.Sum); // Saída: Sum: 6 (1+2+3)
Vec := Str.Collect;
Writeln('Collected: ', Vec.ToString); // Saída: Collected: [H, e, l, l, o, 1, 2, 3]
// Extensões para Integer
Int := 5;
Writeln('Mapped: ', Int.Map(function(X: Integer): Integer begin Result := X * 2; end));
// Saída: Mapped: 10
Writeln('IsEven: ', Int.IsEven); // Saída: IsEven: False
// Extensões para Boolean
if True.IfTrue(procedure begin Writeln('True'); end) then; // Saída: True
// Extensões para Double
Writeln('Rounded: ', 3.7.Round); // Saída: Rounded: 4
// Extensões para TDateTime
Date := Now;
Writeln('Formatted: ', Date.ToFormat('yyyy-mm-dd')); // Saída exemplo: Formatted: 2025-03-19
Writeln('Past: ', Date.AddDays(-1).IsPast); // Saída: Past: True
end;
Eu adoraria receber contribuições para os meus projetos open source. Se você tiver alguma ideia ou correção de bug, sinta-se à vontade para abrir uma issue ou enviar uma pull request.
Create Issues
Para enviar uma pull request, siga estas etapas:
- Faça um fork do projeto
- Crie uma nova branch (
git checkout -b minha-nova-funcionalidade
) - Faça suas alterações e commit (
git commit -am 'Adicionando nova funcionalidade'
) - Faça push da branch (
git push origin minha-nova-funcionalidade
) - Abra uma pull request