module Language.Haskell.Tools.Refactor.DataToNewtype (dataToNewtype) where

import Language.Haskell.Tools.AST
import Language.Haskell.Tools.AST.Gen
import Language.Haskell.Tools.Refactor.RefactorBase

import Language.Haskell.Tools.Refactor (tryRefactor)

tryItOut moduleName = tryRefactor (localRefactoring $ dataToNewtype) moduleName

dataToNewtype :: Domain dom => LocalRefactoring dom
dataToNewtype (Ann mi mod@(Module { _modDecl = AnnList li ls })) 
  = return (Ann mi mod { _modDecl = AnnList li (map changeDeclaration ls) })

changeDeclaration :: Ann Decl dom SrcTemplateStage -> Ann Decl dom SrcTemplateStage
changeDeclaration (Ann a dd@(DataDecl {})) 
  | annLength (_declCons dd) == 1 
      && annLength (_conDeclArgs (_element (_annListElems (_declCons dd) !! 0))) == 1
  = Ann a dd{ _declNewtype = mkNewtypeKeyword }
changeDeclaration decl = decl