An educational pure functional programming library in TypeScript
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Refactor workflow-engine functions to expression style

+17 -22
+17 -22
examples/workflow-engine/with-purus.ts
··· 145 145 146 146 // SIGNATURE: DraftOrder -> Result<PaidOrder, OrderError> 147 147 // Only accepts DraftOrder. Try passing a ShippedOrder - won't compile. 148 - const payOrder = (order: DraftOrder): Result<PaidOrder, OrderError> => { 149 - console.log(`[Payment] Processing payment for order ${order.id}`) 150 - const toPaid = transition<OrderData, "Draft", "Paid">() 151 - return ok(toPaid(order)) 152 - } 148 + const payOrder = (order: DraftOrder): Result<PaidOrder, OrderError> => ( 149 + console.log(`[Payment] Processing payment for order ${order.id}`), 150 + ok(transition<OrderData, "Draft", "Paid">()(order)) 151 + ) 153 152 154 153 // SIGNATURE: PaidOrder -> ShippedOrder 155 154 // Only accepts PaidOrder. No runtime check needed. 156 - const shipOrder = (order: PaidOrder): ShippedOrder => { 157 - console.log(`[Shipping] Shipping order ${order.id}`) 158 - const toShipped = transition<OrderData, "Paid", "Shipped">() 159 - return toShipped(order) 160 - } 155 + const shipOrder = (order: PaidOrder): ShippedOrder => ( 156 + console.log(`[Shipping] Shipping order ${order.id}`), 157 + transition<OrderData, "Paid", "Shipped">()(order) 158 + ) 161 159 162 160 // Branded types in action - compare with without-purus.ts line 71 163 161 const lookupOrder = ( 164 162 orderId: OrderId, // First parameter is OrderId 165 163 customerId: CustomerId // Second parameter is CustomerId 166 - ): Result<DraftOrder, OrderError> => { 167 - if (orderId === "order-1" && customerId === "cust-1") { 168 - const data: OrderData = { 169 - id: orderId, 170 - customerId: customerId, 171 - productId: ProductId("prod-1"), 172 - quantity: 2, 173 - } 174 - return ok(entity<OrderData, "Draft">(data)) 175 - } 176 - return err(OrderError.orderNotFound(orderId)) 177 - } 164 + ): Result<DraftOrder, OrderError> => 165 + orderId === "order-1" && customerId === "cust-1" 166 + ? ok(entity<OrderData, "Draft">({ 167 + id: orderId, 168 + customerId: customerId, 169 + productId: ProductId("prod-1"), 170 + quantity: 2, 171 + })) 172 + : err(OrderError.orderNotFound(orderId)) 178 173 179 174 // ============================================================================= 180 175 // THE BUG THAT BRANDED TYPES PREVENT