Example Projects
+Real-world applications demonstrating Lux's unique capabilities. Clone these to learn by doing.
+API REST API
++ A full REST API for task management with JSON responses, routing, and CRUD operations. +
+Demonstrates
+-
+
- HttpServer effect +
- Pattern matching for routing +
- JSON serialization +
- Effect tracking +
fn router(req): Response with {Http} =
+ match (req.method, req.path) {
+ ("GET", "/") => httpOk(welcome),
+ ("GET", "/tasks") => httpOk(tasks),
+ _ => httpNotFound("404")
+ }
+ TODO Todo App
++ A command-line todo application showcasing algebraic data types and pattern matching. +
+Demonstrates
+-
+
- ADTs for data modeling +
- Pattern matching +
- Recursive list operations +
- Console effect +
type Priority =
+ | Low
+ | Medium
+ | High
+
+type TodoItem =
+ | TodoItem(Int, String, Bool, Priority)
+ JSON JSON Parser
++ A recursive descent JSON parser demonstrating ADTs for AST representation. +
+Demonstrates
+-
+
- ADTs for AST +
- Recursive parsing +
- String manipulation +
- Pure functions +
type JsonValue =
+ | JsonNull
+ | JsonBool(Bool)
+ | JsonNumber(Int)
+ | JsonString(String)
+ | JsonArray(List<JsonValue>)
+ | JsonObject(List<(String, JsonValue)>)
+ GAME Guessing Game
++ A simple number guessing game demonstrating effects for randomness and I/O. +
+Demonstrates
+-
+
- Random effect +
- Console I/O +
- Recursive game loop +
- User input handling +
fn playGame(): Unit
+ with {Console, Random} = {
+ let secret = Random.int(1, 100)
+ Console.print("Guess a number!")
+ guessLoop(secret, 0)
+}
+ MD Markdown Converter
++ Convert Markdown to HTML using pattern matching and string processing. +
+Demonstrates
+-
+
- String manipulation +
- Pattern matching +
- Pure transformation +
- List processing +
fn convertLine(line: String): String =
+ if startsWith(line, "# ") then
+ "<h1>" + rest(line, 2) + "</h1>"
+ else if startsWith(line, "- ") then
+ "<li>" + rest(line, 2) + "</li>"
+ else "<p>" + line + "</p>"
+ CALC Mini Interpreter
++ A tiny expression interpreter demonstrating language implementation patterns. +
+Demonstrates
+-
+
- ADTs for AST +
- Recursive evaluation +
- Environment handling +
- Interpreter patterns +
type Expr =
+ | Num(Int)
+ | Add(Expr, Expr)
+ | Mul(Expr, Expr)
+ | Var(String)
+ | Let(String, Expr, Expr)
+ Featured: Task Manager API
+A Complete Showcase of Lux's Unique Features
+This comprehensive example demonstrates all three of Lux's killer features working together.
+ +1. Algebraic Effects
+Every side effect is explicit in function signatures. No hidden I/O.
+2. Behavioral Types
+Compile-time guarantees: is pure, is total, is idempotent.
3. Schema Evolution
+Versioned types with automatic migration. Data structures evolve safely.
+// Task v1: Original data model
+type Task @v1 {
+ id: String,
+ title: String,
+ done: Bool
+}
+
+// Task v2: Added priority field with migration
+type Task @v2 {
+ id: String,
+ title: String,
+ done: Bool,
+ priority: String,
+
+ // Old tasks get "medium" priority by default
+ from @v1 = {
+ id: old.id,
+ title: old.title,
+ done: old.done,
+ priority: "medium"
+ }
+}
+
+// Pure, total, idempotent business logic
+fn validateTitle(title: String): Result<String, String>
+ is pure, total =
+ if String.length(title) == 0 then
+ Err("Title cannot be empty")
+ else
+ Ok(title)
+ Build Your Own
+Ready to start building with Lux?
+ +