{-# LANGUAGE FlexibleContexts #-}
module Language.Haskell.Tools.Refactor.Predefined.DollarApp2 where

import Language.Haskell.Tools.Refactor

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

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

dollarApp :: (HasImportInfo dom, HasModuleInfo dom) => RealSrcSpan -> LocalRefactoring dom
dollarApp sp = nodesContained sp !~ replaceExpr

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

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