Aus öffentlichen Paketdaten erstellte Orientierung.
Lens4D ist ein Dart-Paket, das die Erstellung komponierbarer, wiederverwendbarer und typsicherer Linsen für immutable Datenstrukturen ermöglicht. Es bietet einen funktionalen Programmieransatz zum Zugriff und zur Aktualisierung verschachtelter Daten ohne Mutation, was die Klarheit und Wartbarkeit des Codes verbessert. Linsen ermöglichen es Entwicklern, sich auf bestimmte Teile komplexer Datenschemata zu konzentrieren, wodurch Änderungen vorhersehbar und sicher werden. Ideal für den Zustandsmanagement in größeren Anwendungen unterstützt Lens4D alle wichtigen Plattformen, einschließlich Web, Mobil und Desktop.
Anwendungsfälle
Immutable Zustandsupdates
Verschachtelte Datenmanipulation
Funktionale Zustandsverwaltung
Reaktive Benutzeroberflächentwicklung
Typsichere Datenzugriffe
Code-Wiederverwendung bei Daten Transformationen
Hauptmerkmale
Typsichere Lens-Erstellung
komponierbare Linsen
Immutable Datenaktualisierungen
Unterstützung für verschachtelte Strukturen
Funktionsorientierter Programmierparadigma
Plattformübergreifende Kompatibilität
Geeignet für
Entwickler, die funktionale Programmierung verwenden
Zustandsverwaltung in großen Anwendungen
Teams, die Typensicherheit priorisieren
Anwendungen mit komplexen verschachtelten Daten
Frontend-Entwickler, die mehrere Plattformen ansprechen
Hinweise
Erfahrung mit funktionaler Programmierung erforderlich
Lernkurve für Anfänger
Am besten geeignet für Muster aus unveränderlichen Daten
Kann bei einfachen Anwendungsfällen Overhead hinzufügen
Eingeschränkte Dokumentation im Vergleich zu Mainstream-Paketen
Original-README
Originaler README-Schnappschuss aus dem verknüpften Quell-Repository. Aktuelle Inhalte finden Sie im Repository.
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