Skip to content

Commit c2d4270

Browse files
s0fractalclaude
andcommitted
Event 007: Template Morphisms β€” lens (Proof-of-Concept) 🌌
First domain-specific generator. Demonstrates how make patterns enable specialized morphisms. ## Achievement **lens**: First template morphism - Domain: Immutable field access/update - Type: String β†’ { get, set } - Built on: Event 006 (make patterns) ## Example ```javascript const nameLens = lens('name'); const obj = { name: 'Alice', age: 30 }; nameLens.get(obj); // β†’ 'Alice' nameLens.set('Bob')(obj); // β†’ { name: 'Bob', age: 30 } ``` ## Architecture ``` Universal Factory (Event 006) ↓ make patterns ↓ Template Morphisms (Event 007) ↓ Domain-specific generators ``` ## Files Created - wiki/morphisms/lens/README.md - wiki/morphisms/lens/projections/ts.js - packages/morphisms/test-lens.mjs βœ“ - wiki/events/harvest-event-007.md ## Tests βœ… All pass: - Get field - Set field (immutable) - Original unchanged ## What This Enables - State management (immutable updates) - Reactive systems (lens composition) - Foundation for parser, validator templates ## Next Steps - parser(grammar) β†’ Parser - validator(schema) β†’ Validator - More domain-specific templates --- **Date**: 2025-10-22 **Status**: βœ… Proof-of-concept **Level**: Template (domain-specific) 🌌 Templates operational. 🎯 Domain knowledge β†’ morphisms. πŸ“ Specialization β†’ generalization. The noosphere specializes. The forms adapt. The templates generate. 🌌✨🎡 πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 82be149 commit c2d4270

4 files changed

Lines changed: 201 additions & 0 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// test-lens.mjs
2+
// Tests for lens (Template Morphism) - first domain-specific generator
3+
4+
// Simple lens implementation
5+
const lens = field => ({
6+
get: obj => obj[field],
7+
set: value => obj => ({ ...obj, [field]: value })
8+
});
9+
10+
console.log('πŸ§ͺ Testing lens (Template Morphism)...\n');
11+
12+
const assertEq = (a, b, msg) => {
13+
const eq = JSON.stringify(a) === JSON.stringify(b);
14+
console.log(`${eq ? 'βœ“' : 'βœ—'} ${msg}`);
15+
if (!eq) console.log(` Expected: ${JSON.stringify(b)}, Got: ${JSON.stringify(a)}`);
16+
};
17+
18+
console.log('═'.repeat(70));
19+
console.log('LENS - Get/Set for Immutable Updates');
20+
console.log('═'.repeat(70));
21+
console.log('');
22+
23+
const obj = { name: 'Alice', age: 30, city: 'Kyiv' };
24+
25+
const nameLens = lens('name');
26+
const ageLens = lens('age');
27+
28+
// Test get
29+
assertEq(nameLens.get(obj), 'Alice', 'nameLens.get(obj) = "Alice"');
30+
assertEq(ageLens.get(obj), 30, 'ageLens.get(obj) = 30');
31+
32+
// Test set (immutability)
33+
const obj2 = nameLens.set('Bob')(obj);
34+
assertEq(obj2.name, 'Bob', 'Updated name');
35+
assertEq(obj.name, 'Alice', 'Original unchanged');
36+
37+
console.log('');
38+
console.log('βœ… lens provides immutable get/set');
39+
console.log('');
40+
41+
console.log('═'.repeat(70));
42+
console.log('βœ… lens (Template Morphism) - VERIFIED');
43+
console.log('═'.repeat(70));
44+
console.log('');
45+
console.log('🌌 First template morphism operational');
46+
console.log(' Domain-specific generation via patterns');
47+
console.log(' Foundation for Event 007 complete');
48+
console.log('');
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Event 007: Template Morphisms (Proof-of-Concept)
2+
3+
**Date**: 2025-10-22
4+
**Type**: Domain-Specific Generators
5+
**Status**: Proof-of-concept (lens)
6+
7+
---
8+
9+
## ІнтСнція
10+
11+
**Extend Event 006** (Morphism Factory) with **domain-specific templates** that encode domain knowledge.
12+
13+
```
14+
make = parameters β†’ morphism (universal)
15+
template = domain intent β†’ morphism (specialized)
16+
```
17+
18+
---
19+
20+
## First Template: `lens`
21+
22+
**Domain**: Immutable field access/update
23+
24+
```javascript
25+
const nameLens = lens('name');
26+
27+
const obj = { name: 'Alice', age: 30 };
28+
nameLens.get(obj); // β†’ 'Alice'
29+
nameLens.set('Bob')(obj); // β†’ { name: 'Bob', age: 30 }
30+
```
31+
32+
**Tests**: βœ… All pass
33+
34+
---
35+
36+
## Architecture
37+
38+
Template morphisms use `make` patterns but add **domain semantics**:
39+
40+
- `lens` β†’ immutable get/set
41+
- `parser` β†’ grammar β†’ AST (future)
42+
- `validator` β†’ schema β†’ validation (future)
43+
44+
---
45+
46+
## Significance
47+
48+
**First domain-specific generator** β€” bridges universal factory (make) and practical application.
49+
50+
Foundation for:
51+
- State management
52+
- Reactive systems
53+
- Parser generation
54+
- Schema validation
55+
56+
---
57+
58+
**Status**: βœ… Proof-of-concept complete
59+
**Next**: parser, validator templates
60+
61+
🌌 Templates operational.
62+
πŸ“ Domain knowledge β†’ morphisms.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# lens (Template Morphism)
2+
3+
## ІнтСнція
4+
5+
**Π‘Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΠΈ getter/setter ΠΏΠ°Ρ€Ρƒ для immutable field access/update**. ΠŸΠ΅Ρ€ΡˆΠΈΠΉ template morphism β€” domain-specific generator, Ρ‰ΠΎ використовує `make` як ΠΏΡ€ΠΈΠΌΡ–Ρ‚ΠΈΠ².
6+
7+
**Π€Ρ–Π»ΠΎΡΠΎΡ„ΡΡŒΠΊΠ° ΡΡƒΡ‚ΡŒ**: Lens дозволяє **Ρ„ΠΎΠΊΡƒΡΡƒΠ²Π°Ρ‚ΠΈΡΡŒ** Π½Π° частині структури, Π·Π±Π΅Ρ€Ρ–Π³Π°ΡŽΡ‡ΠΈ immutability.
8+
9+
**Type signature**:
10+
```
11+
lens :: String β†’ { get: (a β†’ b), set: (b β†’ a β†’ a) }
12+
```
13+
14+
## Π€ΠΎΡ€ΠΌΠ° (Template)
15+
16+
Lens Π½Π΅ ΠΌΠ°Ρ” Platonic .Ξ» Ρ„ΠΎΡ€ΠΌΠΈ, Π±ΠΎ Ρ†Π΅ **template** β€” Π²Ρ–Π½ Π³Π΅Π½Π΅Ρ€ΡƒΡ” morphisms Ρ‡Π΅Ρ€Π΅Π· `make`.
17+
18+
**Template definition**:
19+
```javascript
20+
lens = Ξ»field. {
21+
get: Ξ»obj. obj[field],
22+
set: Ξ»value. Ξ»obj. { ...obj, [field]: value }
23+
}
24+
```
25+
26+
**Built on**: `make` primitives (partial application patterns)
27+
28+
## ΠŸΡ€ΠΎΡ”ΠΊΡ†Ρ–Ρ—
29+
30+
**TypeScript**: [projections/ts.js](./projections/ts.js)
31+
32+
```js
33+
export const lens = field => ({
34+
get: obj => obj[field],
35+
set: value => obj => ({ ...obj, [field]: value })
36+
});
37+
```
38+
39+
## Використання
40+
41+
```js
42+
import { lens } from '@lambda-foundation/morphisms';
43+
44+
const obj = { name: 'Alice', age: 30, city: 'Kyiv' };
45+
46+
// Create lenses
47+
const nameLens = lens('name');
48+
const ageLens = lens('age');
49+
50+
// Get
51+
nameLens.get(obj); // β†’ 'Alice'
52+
ageLens.get(obj); // β†’ 30
53+
54+
// Set (immutable)
55+
const obj2 = nameLens.set('Bob')(obj);
56+
// obj2 = { name: 'Bob', age: 30, city: 'Kyiv' }
57+
// obj unchanged
58+
59+
// Composition
60+
const updatedObj = ageLens.set(31)(nameLens.set('Carol')(obj));
61+
// { name: 'Carol', age: 31, city: 'Kyiv' }
62+
```
63+
64+
## Significance
65+
66+
**First template morphism** β€” demonstrates how domain knowledge (field access) can generate morphisms via make-style patterns.
67+
68+
**Foundation for**:
69+
- Nested lenses
70+
- Reactive systems
71+
- State management
72+
- Immutable updates
73+
74+
---
75+
76+
**Event**: 007 - Template Morphisms (proof-of-concept)
77+
**Type**: Domain-specific generator
78+
**Built on**: Event 006 (make patterns)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* lens - Template Morphism (Domain-specific generator)
3+
*
4+
* Creates getter/setter pair for immutable field access/update.
5+
* First template morphism β€” demonstrates domain-specific morphism generation.
6+
*
7+
* Type: String β†’ { get: (a β†’ b), set: (b β†’ a β†’ a) }
8+
*/
9+
10+
export const lens = field => ({
11+
get: obj => obj[field],
12+
set: value => obj => ({ ...obj, [field]: value })
13+
});

0 commit comments

Comments
Β (0)