hledger-1.13: Hledger/Cli/Commands/Checkdupes.hs
{-# LANGUAGE TemplateHaskell #-}
module Hledger.Cli.Commands.Checkdupes (
checkdupesmode
,checkdupes
)
where
import Data.Function
import Data.List
import qualified Data.Text as T
import Hledger
import Hledger.Cli.CliOptions
import System.Console.CmdArgs.Explicit
import Text.Printf
checkdupesmode :: Mode RawOpts
checkdupesmode = hledgerCommandMode
($(hereFileRelative "Hledger/Cli/Commands/Checkdupes.txt"))
[]
[generalflagsgroup1]
[]
([], Nothing)
checkdupes _opts j = mapM_ render $ checkdupes' $ accountsNames j
accountsNames :: Journal -> [(String, AccountName)]
accountsNames j = map leafAndAccountName as
where leafAndAccountName a = (T.unpack $ accountLeafName a, a)
ps = journalPostings j
as = nub $ sort $ map paccount ps
checkdupes' :: (Ord k, Eq k) => [(k, v)] -> [(k, [v])]
checkdupes' l = zip dupLeafs dupAccountNames
where dupLeafs = map (fst . head) d
dupAccountNames = map (map snd) d
d = dupes' l
dupes' = filter ((> 1) . length)
. groupBy ((==) `on` fst)
. sortBy (compare `on` fst)
render :: (String, [AccountName]) -> IO ()
render (leafName, accountNameL) = printf "%s as %s\n" leafName (concat $ intersperse ", " (map T.unpack accountNameL))