@@ -214,8 +214,25 @@ public final class ActionHandler<Action, State, ActionResult: Sendable> {
214214extension ActionHandler {
215215 /// Adds error handling to the action processing pipeline.
216216 ///
217+ /// The error handler receives any errors thrown during action processing
218+ /// and can update state accordingly (e.g., setting error messages, resetting loading flags).
219+ ///
217220 /// - Parameter errorHandler: A closure that handles errors
218221 /// - Returns: A new ActionHandler with error handling
222+ ///
223+ /// - Note: If you call `onError` multiple times, only the **last** handler will be used.
224+ /// Each call replaces the previous error handler.
225+ ///
226+ /// ## Example
227+ /// ```swift
228+ /// ActionHandler { action, state in
229+ /// // action processing
230+ /// }
231+ /// .onError { error, state in
232+ /// state.errorMessage = error.localizedDescription
233+ /// state.isLoading = false
234+ /// }
235+ /// ```
219236 public func onError( _ errorHandler: @escaping ( Error , State ) -> Void ) -> ActionHandler <
220237 Action , State , ActionResult
221238 > {
@@ -224,8 +241,34 @@ extension ActionHandler {
224241
225242 /// Transforms the task returned by action processing.
226243 ///
244+ /// Use this to add cross-cutting concerns like logging, analytics, or monitoring
245+ /// to all tasks without modifying individual action handlers.
246+ ///
227247 /// - Parameter taskTransform: A closure that transforms the task
228248 /// - Returns: A new ActionHandler with task transformation
249+ ///
250+ /// ## Example: Add Logging to All Tasks
251+ /// ```swift
252+ /// ActionHandler { action, state in
253+ /// // action processing
254+ /// }
255+ /// .transform { task in
256+ /// switch task.operation {
257+ /// case .run(let id, let name, let operation, let onError, let cancelInFlight, let priority):
258+ /// return .run(id: id, name: name, priority: priority) { state in
259+ /// print("Task '\(name ?? id)' starting")
260+ /// let result = try await operation(state)
261+ /// print("Task '\(name ?? id)' completed")
262+ /// return result
263+ /// } onError: { error, state in
264+ /// print("Task '\(name ?? id)' failed: \(error)")
265+ /// onError?(error, state)
266+ /// }
267+ /// default:
268+ /// return task
269+ /// }
270+ /// }
271+ /// ```
229272 public func transform(
230273 _ taskTransform: @escaping ( ActionTask < Action , State , ActionResult > )
231274 -> ActionTask < Action , State , ActionResult >
@@ -235,8 +278,26 @@ extension ActionHandler {
235278
236279 /// Adds custom middleware to the action processing pipeline.
237280 ///
281+ /// Middleware is executed in the order it's added. Call `use` multiple times
282+ /// to add multiple middlewares, and they will execute sequentially.
283+ ///
238284 /// - Parameter middleware: The middleware to add
239285 /// - Returns: A new ActionHandler with the middleware added
286+ ///
287+ /// ## Example: Add Multiple Middlewares
288+ /// ```swift
289+ /// ActionHandler { action, state in
290+ /// // action processing
291+ /// }
292+ /// .use(LoggingMiddleware()) // Executes first
293+ /// .use(AnalyticsMiddleware()) // Executes second
294+ /// .use(TimingMiddleware()) // Executes third
295+ /// ```
296+ ///
297+ /// - Note: Middleware executes in **registration order**:
298+ /// - `beforeAction` hooks run in order (first → last)
299+ /// - Action logic executes
300+ /// - `afterAction` hooks run in order (first → last)
240301 public func use( _ middleware: some BaseActionMiddleware ) -> ActionHandler <
241302 Action , State , ActionResult
242303 > {
0 commit comments