 
   public static var word: _CharacterClassModel {
     .init(cc: .word, matchLevel: .graphemeCluster)
-  }
-
-  public static func custom(
-    _ components: [_CharacterClassModel.CharacterSetComponent]
-  ) -> _CharacterClassModel {
-    .init(cc: .custom(components), matchLevel: .graphemeCluster)
-  }
-}
-
-extension _CharacterClassModel.CharacterSetComponent: CustomStringConvertible {
-  public var description: String {
-    switch self {
-    case .range(let range): return "<range \(range)>"
-    case .character(let character): return "<character \(character)>"
-    case .characterClass(let custom): return "\(custom)"
-    case .setOperation(let op): return "<\(op.lhs) \(op.op) \(op.rhs)>"
-    }
   }
 }
 

    var cc = self
    cc.matchLevel = level
    return cc
  }
}

extension DSLTree.Atom {
    var characterClass: _CharacterClassModel? {
    switch self {
    case let .unconverted(a):
      return a.ast.characterClass

    default: return nil
    }
  }
}


    case .verticalWhitespace: return "vertical whitespace"
    case .whitespace: return "<whitespace>"
    case .word: return "<word>"
    }
  }
}
