{-# LANGUAGE MonoLocalBinds #-}

module Language.Haskell.Tools.Refactor.Builtin.DollarApp2 where

import Language.Haskell.Tools.Refactor

import Control.Reference ((!~))
import Id (idName)
import PrelInfo (wiredInIds)
import PrelNames (dollarIdKey)
import SrcLoc (RealSrcSpan)
import Unique (getUnique)

tryItOut :: String -> String -> IO ()
tryItOut = tryRefactor (localRefactoring . dollarApp)

dollarApp :: RealSrcSpan -> LocalRefactoring
dollarApp sp = nodesContained sp !~ replaceExpr

replaceExpr :: Expr -> LocalRefactor Expr
replaceExpr (App fun (Paren arg)) = mkInfixApp fun <$> referenceOperator dollarName <*> pure arg
replaceExpr e = pure e

[dollarName] = map idName $ filter ((dollarIdKey==) . getUnique) wiredInIds