content: 
  module RefacSwapArgs(swapArgs) where
  import RefacUtils
  
  swapArgs args  
   = do let fileName = ghead "filename" args       
            row      = read (args!!1)::Int        
            col      = read (args!!2)::Int        
        modInfo@(_,exps, mod, toks)<-parseSourceFile fileName  
        let pnt =locToPNT fileName (row, col) mod     
        if isFunPNT pnt mod   
         then do r<-applyRefac (doSwap pnt) (Just modInfo) fileName
                 rs <-if isExported pnt exps 
                        then  applyRefacToClientMods (doSwap pnt) fileName
                        else  return []
                 writeRefactoredFiles False (r:rs)      
         else error "\nInvalid cursor position!"  
  
  -- Inside a single module.
  doSwap pnt (_ , _, mod) = applyTP (full_buTP (idTP `adhocTP`  inMatch 
                                                     `adhocTP`  inExp
                                                     `adhocTP`  inDecl)) mod
    where 
      -- In the define site.
      inMatch ((HsMatch loc fun pats rhs ds)::HsMatchP)
        | fun == pnt   
        = case pats of    
           (p1:p2:ps) -> do  pats''<-update p2 p1 =<< update p1 p2 pats
                             return (HsMatch loc fun pats'' rhs ds)
           _          -> error "Insufficient arguments to swap." 
      inMatch m = return m  
  
      -- In the call-site.
      inExp exp@((Exp (HsApp (Exp (HsApp e e1)) e2))::HsExpP)
        | expToPNT e == pnt     
        = update e2 e1 =<< update e1 e2 exp     
      inExp e = return e 
   
      -- In the type signature,.
      inDecl (decl@(Dec (HsTypeSig loc is c tp))::HsDeclP)
        |isTypeSigOf pnt decl 
        = if length is ==1 
           then do let (t1:t2:ts)= tyFunToList tp 
                   update t2 t1 =<< update t1 t2 decl
           else error "This type signature defines the type of more than one identifiers."
      inDecl d = return d 
  
      tyFunToList (Typ (HsTyFun t1 t2)) = t1:(tyFunToList t2)
      tyFunToList t = [t]
   
  