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