//! Phase 282 P3: Common extraction interfaces for loop patterns
//!
//! This module provides pure extraction functions for pattern detection.
//! Extraction functions follow the ExtractionBased strategy (Phase 272 P0.2).
//!
//! # Design Principles
//!
//! - **Pure Functions**: No builder mutations, no side effects
//! - **Fail-Fast**: `Err` for logic bugs, `Ok(None)` for non-matches
//! - **SSOT**: Extraction is re-run in `lower()` (no caching assumptions)
//! - **Result<Option<Parts>, String>**: Pattern8/9 model
//!
//! # Pattern Migration Status
//!
//! - Pattern1: ✅ Migrated (Phase 282 P3)
//! - Pattern2: ✅ Migrated (Phase 282 P4)
//! - Pattern3: ✅ Migrated (Phase 282 P5)
//! - Pattern4: ✅ Migrated (Phase 282 P6)
//! - Pattern5: ✅ Migrated (Phase 282 P7)
//! - Pattern6-7: ✅ Plan-based (Phase 273, different path)
//! - Pattern8-9: ✅ Already ExtractionBased (Phase 259/270)

pub(crate) mod pattern1;
pub(crate) mod pattern2;  // Phase 282 P4: Pattern2 extraction
pub(crate) mod pattern3;  // Phase 282 P5: Pattern3 extraction
pub(crate) mod pattern4;  // Phase 282 P6: Pattern4 extraction
// Pattern5/8/9 extractors moved to plan layer; joinir uses plan::single_planner routing.
