generateledger tool, creates test ledgers of specified size
This commit is contained in:
		
							parent
							
								
									1a491e883a
								
							
						
					
					
						commit
						22c6d62907
					
				
							
								
								
									
										59
									
								
								tools/generateledger.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								tools/generateledger.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | #!/usr/bin/env runhaskell | ||||||
|  | {-  | ||||||
|  | generateledger.hs NUMTXNS NUMACCTS ACCTDEPTH | ||||||
|  | 
 | ||||||
|  | Outputs a dummy ledger file with the specified number of transactions, | ||||||
|  | number of accounts, and account tree depth. Useful for | ||||||
|  | testing/profiling/benchmarking. | ||||||
|  | 
 | ||||||
|  | -} | ||||||
|  | 
 | ||||||
|  | module Main | ||||||
|  | where | ||||||
|  | import System.Environment | ||||||
|  | import Control.Monad | ||||||
|  | import Data.Time.LocalTime | ||||||
|  | import Data.Time.Calendar | ||||||
|  | import Text.Printf | ||||||
|  | import Numeric | ||||||
|  | 
 | ||||||
|  | main = do | ||||||
|  |   args <- getArgs | ||||||
|  |   let [numtxns, numaccts, acctdepth] = map read args :: [Int] | ||||||
|  |   today <- getCurrentDay | ||||||
|  |   let (year,_,_) = toGregorian today | ||||||
|  |   let d = fromGregorian (year-1) 1 1 | ||||||
|  |   let dates = iterate (addDays 1) d | ||||||
|  |   let accts = pair $ cycle $ take numaccts $ uniqueacctnames acctdepth | ||||||
|  |   mapM_ (\(n,d,(a,b)) -> putStr $ showtxn n d a b) $ take numtxns $ zip3 [1..] dates accts | ||||||
|  |   return () | ||||||
|  | 
 | ||||||
|  | showtxn :: Int -> Day -> String -> String -> String | ||||||
|  | showtxn txnno date acct1 acct2 = | ||||||
|  |     printf "%s transaction %d\n  %-40s  %2d\n  %-40s  %2d\n\n" d txnno acct1 amt acct2 (-amt) | ||||||
|  |     where | ||||||
|  |       d = show date | ||||||
|  |       amt = 1::Int | ||||||
|  | 
 | ||||||
|  | uniqueacctnames :: Int -> [String] | ||||||
|  | uniqueacctnames depth = uniqueacctnames' depth uniquenames | ||||||
|  |     where uniquenames = map hex [1..] where hex = flip showHex "" | ||||||
|  | 
 | ||||||
|  | uniqueacctnames' depth uniquenames = group some ++ uniqueacctnames' depth rest | ||||||
|  |     where (some, rest) = splitAt depth uniquenames | ||||||
|  | 
 | ||||||
|  | -- group ["a", "b", "c"] = ["a","a:b","a:b:c"] | ||||||
|  | group :: [String] -> [String] | ||||||
|  | group [] = [] | ||||||
|  | group (a:as) = [a] ++ (map ((a++":")++) $ group as) | ||||||
|  | 
 | ||||||
|  | pair :: [a] -> [(a,a)] | ||||||
|  | pair [] = [] | ||||||
|  | pair [a] = [(a,a)] | ||||||
|  | pair (a:b:rest) = ((a,b):(pair rest)) | ||||||
|  | 
 | ||||||
|  | getCurrentDay :: IO Day | ||||||
|  | getCurrentDay = do | ||||||
|  |     t <- getZonedTime | ||||||
|  |     return $ localDay (zonedTimeToLocalTime t) | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user