Orientação gerada a partir de informações públicas. Apenas para referência.
Lens4D é um pacote Dart que permite a criação de lentes compostas, reutilizáveis e seguras por tipo para estruturas de dados imutáveis. Ele oferece uma abordagem de programação funcional para acessar e atualizar dados aninhados sem mutação, melhorando a clareza e a manutenibilidade do código. Lentes permitem que os desenvolvedores se concentrem em partes específicas de modelos de dados complexos, tornando as atualizações previsíveis e seguras. Ideal para gerenciamento de estado em aplicações maiores, o Lens4D suporta todas as plataformas principais, incluindo web, móvel e desktop.
Casos de uso
Atualizações de estado imutáveis
Manipulação de dados aninhados
Gerenciamento de estado funcional
Desenvolvimento de interface do usuário reativa
Acesso seguro a dados por tipo
Reutilização de código em transformações de dados
Principais recursos
Criação de lente segura por tipo
lentes compostos
Atualizações de dados imutáveis
Suporte para estruturas aninhadas
Paradigma de programação funcional
Compatibilidade multiplataforma
Indicado para
Desenvolvedores usando programação funcional
Gerenciamento de estado em aplicativos grandes
Equipes que priorizam a segurança de tipos
Aplicações com dados aninhados complexos
Desenvolvedores front-end direcionados para múltiplas plataformas
Considerações
Requer conhecimento de programação funcional
Curva de aprendizado para iniciantes
Mais adequado para padrões de dados imutáveis
Pode adicionar sobrecarga em casos de uso simples
Documentação limitada em comparação com pacotes principais
README original
Snapshot do README original do repositório-fonte vinculado. Consulte o repositório para o conteúdo mais recente.
lens4d
A functional lens library for Dart, enabling type-safe, composable data access and modification.
Overview
Lenses are a functional programming pattern that provide a clean, type-safe way to focus on, extract from, and modify deeply nested data structures. Originally from Haskell and popularized in languages like Scala and Kotlin, lenses solve the problem of working with immutable data in an elegant, composable way.
This library is inspired by and adapted from the lens system in http4k Kotlin library, bringing the power of functional lenses to Dart.
Why Lenses?
Working with immutable data often leads to verbose, error-prone code:
// Without lenses - verbose and fragilefinal newUri = uri.replace(
queryParameters: {
...uri.queryParameters,
'search': 'flutter',
'limit': '20',
}
);
With lenses, the same operation becomes clean and composable:
// With lenses - clean and type-safefinal newUri = uri.havingAll([
Query.required('search').of('flutter'),
Query.integer().required('limit').of(20),
]);
Features
✅ Type-safe data access - Extract and modify values with compile-time type safety
✅ Functional composition - Chain operations with having() and havingAll()
✅ Bidirectional lenses - Both read from and write to data structures
✅ Type conversions - Built-in conversions for integers, booleans, dates, and more
✅ Error handling - Comprehensive failure handling with detailed error information
✅ Zero dependencies - Pure Dart implementation
Quick Start
Installation
Add lens4d to your pubspec.yaml:
dependencies:lens4d:^1.0.0
Basic Usage
Here's a practical example working with URI query parameters:
import'package:lens4d/lens4d.dart';
/// Define a Query lens for Uri objectsfinalQuery = BiDiLensSpec<Uri, String>(
'query',
constStringParam(),
LensGet<Uri, String>((name, uri) {
final value = uri.queryParameters[name];
return value != null ? [value] : [];
}),
LensSet<Uri, String>((name, values, uri) {
final newParams = Map<String, String>.from(uri.queryParameters);
if (values.isEmpty) {
newParams.remove(name);
} else {
newParams[name] = values.first;
}
return uri.replace(queryParameters: newParams);
}),
);
voidmain() {
final uri = Uri.parse('https://api.example.com/search?q=dart&limit=10');
// Extract values with type safetyfinal searchTerm = Query.required('q')(uri); // 'dart'final limit = Query.integer().required('limit')(uri); // 10 (as int)final page = Query.integer().optional('page')(uri); // null// Single modificationfinal newUri = uri.having(Query.required('q').of('flutter'));
// Multiple modificationsfinal complexUri = uri.havingAll([
Query.required('search').of('dart programming'),
Query.integer().required('limit').of(50),
Query.boolean().required('debug').of(true),
]);
// Error handlingtry {
Query.required('missing')(uri);
} onLensFailurecatch (e) {
print('Parameter not found: ${e.failures.first}');
}
}
Type Conversions
Lenses support automatic type conversions, which are extensible via extension methods:
The having() and havingAll() extension methods enable clean functional composition:
// Chain single modificationsfinal result = data
.having(someLens.of(value1))
.having(anotherLens.of(value2));
// Apply multiple modifications at oncefinal result = data.havingAll([
lens1.of(value1),
lens2.of(value2),
lens3.of(value3),
]);
API Overview
BiDiLensSpec<IN, OUT> - Bidirectional lens specification for extraction and injection
LensSpec<IN, OUT> - Unidirectional lens for extraction only