File: CHANGES.md

package info (click to toggle)
haskell-hledger-lib 1.32.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,336 kB
  • sloc: haskell: 14,109; makefile: 7
file content (1900 lines) | stat: -rw-r--r-- 66,935 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
<!--
 _ _ _     
| (_) |__  
| | | '_ \ 
| | | |_) |
|_|_|_.__/ 
           
Breaking changes

Fixes

Improvements

-->
Internal/api/developer-ish changes in the hledger-lib (and hledger) packages.
For user-visible changes, see the hledger package changelog.

# 1.32.3 2024-01-28

- Some API renames ended up in this release, including

  - amountStripPrices    -> amountStripCost
  - showAmountPrice      -> showAmountCostB
  - showAmountPriceDebug -> showAmountCostDebug

# 1.32.2 2023-12-31

Breaking changes

- In Hledger.Data.Amount, noPrice is renamed to noCost.

- AmountDisplayOpts has a new displayCommodity flag, controlling commodity symbol display.

Fixes

- Hledger.Utils.Debug.traceOrLog was logging when it should trace and vice versa.

Improvements

- Allow megaparsec 9.6

# 1.32.1 2023-12-07

- readFileStrictly is now provided by Hledger.Utils.IO

# 1.32 2023-12-01

Misc. changes

- styleAmounts is used in more places

- journalApplyCommodityStyles renamed to journalStyleAmounts

- "hard" and "all" rounding strategies have been added

- debug output improvements, eg for precision handling

- Table is now Showable, for debugging


# 1.31 2023-09-03

Breaking changes

- There is a new consolidated API for styling amounts, and a
  convenient HasAmounts typeclass.  AmountStyle's fields have been
  renamed/reordered more mnemonically, and setting the precision is
  now optional.  (This simplifies the amount-stylingn code, but
  complicates the semantics a little. When reading, an unset precision
  generally behaves like NaturalPrecision.)

- (Possible breaking change):
  showMixedAmountLinesB, showAmountB, showAmountPrice now preserve
  commodityful zeroes when rendering. This is intended to affect print output,
  but it seems possible it might also affect balance and register reports,
  though our tests show no change in those.

- Renamed: journalAddInferredEquityPostings -> journalInferEquityFromCosts

Misc. changes

- Reports now do a final amount styling pass before rendering.

- groupByDateSpan code cleanup (Jay Neubrand)

- Allow aeson 2.2, megaparsec 9.5

# 1.30 2023-06-01

Breaking changes

- dropped: Hledger.Data.RawOptions.inRawOpts

Misc. changes

- added more terminal size, ANSI style/color helpers in Hledger.Utils.IO
  (and therefore Hledger and Hledger.Cli.Script):

      getTerminalHeightWidth
      getTerminalHeight
      getTerminalWidth
      bold'
      faint'
      black'
      red'
      green'
      yellow'
      blue'
      magenta'
      cyan'
      white'
      brightBlack'
      brightRed'
      brightGreen'
      brightYellow'
      brightBlue'
      brightMagenta'
      brightCyan'
      brightWhite'
      rgb'
      multicol
      expandGlob
      sortByModTime

# 1.29.2 2023-04-07

# 1.29.1 2023-03-16

- Hledger.Utils.String:

       added:
       strip1Char
       stripBy
       strip1By

- Allow building with GHC 9.6.1; add base-compat (#2011)

# 1.29 2023-03-11
- added terminal colour detection helpers:
  terminalIsLight
  terminalLightness
  terminalFgColor
  terminalBgColor

- Hledger.Data.RawOptions: add unsetboolopt

- add journalMarkRedundantCosts to help with balancing

- journalInferCosts -> journalInferCostsFromEquity

- `BalancingOpts{infer_transaction_prices_ -> infer_balancing_costs_}`

- Hledger.Data.Balancing: inferBalancingPrices -> transactionInferBalancingCosts

- Hledger.Data.Balancing: inferBalancingAmount -> transactionInferBalancingAmount

- Hledger.Data.Journal: transactionAddPricesFromEquity -> transactionInferCostsFromEquity

- Hledger.Data.Journal: journalAddPricesFromEquity -> journalInferCosts

- Hledger.Data.Dates: intervalStartBefore -> intervalBoundaryBefore

- Hledger.Read.Common: cleaned up some amount parsers; describe Ledger lot notation
  ```
  amountpwithmultiplier -> amountp'
  amountpnolotpricesp   -> amountnobasisp
  amountwithoutpricep   -> simpleamountp
  priceamountp          -> costp
  ```

- depend on text-ansi


# 1.28 2022-12-01

- Hledger.Utils.Debug's debug logging helpers have been unified.
  The "trace or log" functions log to stderr by default, or to a file
  if ",logging" is appended to the program name (using withProgName). 
  The debug log file is PROGNAME.log (changed from debug.log).

- Moved from Hledger.Utils.Debug to Hledger.Utils.Parse:
  traceParse
  traceParseAt
  dbgparse

- Moved from Hledger.Utils.Debug to Hledger.Utils.Print:
  pshow
  pshow'
  pprint
  pprint'
  colorOption
  useColorOnStdout
  useColorOnStderr
  outputFileOption
  hasOutputFile

- Rename Hledger.Utils.Print -> Hledger.Utils.IO, consolidate utils there.

- Hledger.Utils cleaned up.

- Hledger.Data.Amount: showMixedAmountOneLine now also shows costs.
  Note that different costs are kept separate in amount arithmetic.

- Hledger.Read.Common: rename/add amount parsing helpers.

  added:
   parseamount
   parseamount'
   parsemixedamount
   parsemixedamount'

  removed:
   amountp'
   mamountp'

- Hledger.Utils.Parse:
  export customErrorBundlePretty, 
  for pretty-printing hledger parse errors.

- Support megaparsec 9.3. (Felix Yan)

- Support GHC 9.4.

- Update cabal files to match hpack 0.35/stack 2.9


# 1.27 2022-09-01

Breaking changes

- Support for GHC 8.6 and 8.8 has been dropped.
  hledger now requires GHC 8.10 or newer.

- Hledger.Data.Amount: `amount` has been dropped; use `nullamt` instead.

- journal*AccountQuery functions have been dropped; use a type: query instead.
  cbcsubreportquery no longer takes Journal as an argument.
  (#1921)

Misc. changes

- Hledger.Utils.Debug now re-exports Debug.Breakpoint from the
  breakpoint library, so that breakpoint's helpers can be used easily
  during development.

- Hledger.Utils.Debug:
  dlog has been replaced by more reliable functions for debug-logging
  to a file (useful for debugging TUI apps like hledger-ui):

  dlogTrace
  dlogTraceAt
  dlogAt
  dlog0
  dlog1
  dlog2
  dlog3
  dlog4
  dlog5
  dlog6
  dlog7
  dlog8
  dlog9

- Hledger.Utils.Debug: pprint' and pshow' have been added,
  forcing monochrome output.

- Hledger.Utils.String: add quoteForCommandLine

- Hledger.Data.Errors: export makeBalanceAssertionErrorExcerpt

- Hledger.Utils.Parse: export HledgerParseErrors

- Debug logging from journalFilePath and the include directive will
  now show "(unknown)" instead of an empty string.

# 1.26.1 2022-07-11

- require safe 0.3.19+ to avoid deprecation warning

# 1.26 2022-06-04

Breaking changes

- readJournal, readJournalFile, readJournalFiles now return
  `ExceptT String IO a` instead of `IO (Either String a)`.
  Internally, this increases composability and avoids some ugly case handling.
  It means that these must now be evaluated with `runExceptT`.
  That can be imported from `Control.Monad.Except` in the `mtl` package,
  but `Hledger.Read` also re-exports it for convenience.

  New variants readJournal', readJournalFiles', readJournalFile' are
  also provided; these are like the old functions but more convenient,
  assuming default input options and needing one less argument.
  (Stephen Morgan)

- parseAndFinaliseJournal' (a variant of parseAndFinaliseJournal) has been removed. 
  In the unlikely event you needed it in your code, you can replace:
  ```haskell
  parseAndFinaliseJournal' parser iopts fp t
  ```
  with:
  ```haskell
  initialiseAndParseJournal parser iopts fp t
  >>= liftEither . journalApplyAliases (aliasesFromOpts iopts)
  >>= journalFinalise iopts fp t
  ```

- Some parsers have been generalised from JournalParser to TextParser.
  (Stephen Morgan)

Misc. changes

- Allow doclayout 0.4.

- Our doctests now run with GHC 9.2+ only, to avoid doctest issues.

- Hledger.Data.JournalChecks: some Journal checks have been moved and renamed:
  journalCheckAccounts,
  journalCheckCommodities,
  journalCheckPayees
  
- Hledger.Data.Errors: new error formatting helpers
  makeTransactionErrorExcerpt,
  makePostingErrorExcerpt,
  transactionFindPostingIndex

- HledgerParseErrors is a new type alias for our parse errors.
  CustomErr has been renamed to HledgerParseErrorData.

- Hledger.Query: added
  matchesQuery,
  queryIsCode,
  queryIsTransactionRelated

- Improve ergonomics of SmartDate constructors. 
  (Stephen Morgan)

- Hledger.Utils: Add a helper function numDigitsInt to get the number
  of digits in an integer, which has a surprising number of ways to
  get it wrong.
  ([#1813](https://github.com/simonmichael/hledger/issues/1813) (Stephen Morgan)

# 1.25 2022-03-04

- hledger-lib now builds with GHC 9.2 and latest deps. 
  ([#1774](https://github.com/simonmichael/hledger/issues/1774)

- Journal has a new jaccounttypes map.
  The journalAccountType lookup function makes it easy to check an account's type.
  The journalTags and journalInheritedTags functions look up an account's tags.
  Functions like journalFilterPostings and journalFilterTransactions,
  and new matching functions matchesAccountExtra, matchesPostingExtra
  and matchesTransactionExtra, use these to allow more powerful matching
  that is aware of account types and tags.

- Journal has a new jdeclaredaccounttags field
  for easy lookup of account tags.
  Query.matchesTaggedAccount is a tag-aware version of matchesAccount.

- Some account name functions have moved from Hledger.Data.Posting
  to Hledger.Data.AccountName:
  accountNamePostingType, accountNameWithPostingType, accountNameWithoutPostingType,
  joinAccountNames, concatAccountNames, accountNameApplyAliases, accountNameApplyAliasesMemo.

- Renamed: CommodityLayout to Layout.

# 1.24.1 2021-12-10

Improvements

- Added: filterQueryOrNotQuery.

# 1.24 2021-12-01

Improvements

- The Semigroup instance of PeriodicReportRow and PeriodicReport now
  preserves the first prrName, rather than the second.
  (Stephen Morgan)

- PeriodicReport and PeriodicReportRow now have Bifunctor instances.
  (Stephen Morgan)

- Move posting rendering functions into Hledger.Data.Posting.
  This produces slightly different output for showPosting, in particular
  it no longer displays the transaction date. However, this has been
  marked as ‘for debugging only’ for a while.
  (Stephen Morgan)

- Drop postingDateOrDate2, transactionDateOrDate2; rename
  whichDateFromOpts to whichDate. (#1731)

- Added new helper functions journalValueAndFilterPostings(With) to make
  valuation and filtration less error prone.
  (Stephen Morgan)

- Avoid deprecation warnings with safe 0.3.18+. 
  (Stephen Morgan)

- Drop base-compat-batteries dependency. 
  (Stephen Morgan)

- Allow megaparsec 9.2.

# 1.23 2021-09-21

- Require base >=4.11, prevent red squares on Hackage's build matrix.

Much code cleanup and reorganisation, such as:

- Introduce lenses for many types. (Stephen Morgan)

- The now-obsolete normaliseMixedAmount and
  normaliseMixedAmountSquashPricesForDisplay functions have been
  dropped. (Stephen Morgan)

- GenericSourcePos has been dropped, replaced by either SourcePos or
  (SourcePos, SourcePos), simplifying module structure. (Stephen Morgan)

- Functions related to balancing (both transaction balancing and journal balancing)
  have been moved to Hledger.Data.Balancing, reducing module size and reducing the risk
  of import cycles.
  (Stephen Morgan)

- `ReportOptions{infer_value_}` has been renamed to `infer_prices_`,
  for more consistency with the corresponding CLI flag.
  And `BalancingOpts{infer_prices_}` is now `infer_transaction_prices_`.

- JournalParser and ErroringJournalParser have moved to
  Hledger.Data.Journal. (Stephen Morgan)

- MixedAmounts now have a more predictable Ord instance / sort order.
  They are compared in each commodity in turn, with
  alphabetically-first commodity symbols being most significant.
  Missing commodities are assumed to be zero. 
  As a consequence, all the ways of representing zero with a MixedAmount ([],
  [A 0], [A 0, B 0, ...]) are now Eq-ual (==), whereas before they were
  not. We have not been able to find anything broken by this change.
  ([#1563](https://github.com/simonmichael/hledger/issues/1563), 
  [#1564](https://github.com/simonmichael/hledger/issues/1564), 
  Stephen Morgan)

- HUnit's testCase and testGroup are now used directly instead of
  having test and tests aliases. (Stephen Morgan)

- The codebase now passes many hlint checks

- Dropped modules:
  Hledger.Utils.Color,
  Hledger.Data.Commodity,
  Hledger.Utils.UTF8IOCompat,
  Hledger.Utils.Tree module.
  (Stephen Morgan)

- Drop the deprecated old-time lib.
  A small number type signatures have changed:
  journalSetLastReadTime, maybeFileModificationTime and Journal
  now use POSIXTime instead of ClockTime.
  Hledger.Cli.Utils.utcTimeToClockTime has been removed, 
  as it is now equivalent to utcTimeToPOSIXSeconds from Data.Time.Clock.POSIX.
  To get the current system time, you should now use getPOSIXTime 
  from Data.Time.Clock.POSIX instead of getClockTime.
  ([#1650](https://github.com/simonmichael/hledger/issues/1650), Stephen Morgan)

- modifyTransactions now takes a Map of commodity styles, and will style amounts according to that argument. journalAddForecast and journalTransform now return an Either String Journal. (Stephen Morgan)
  This improves efficiency, as we no longer have to restyle all amounts in
  the journal after generating auto postings or periodic transactions.
  Changing the return type of journalAddForecast and journalTransform
  reduces partiality.
  To get the previous behaviour for modifyTransaction, use modifyTransaction mempty.

- Refactor journalFinalise to clarify flow. (Stephen Morgan)
  The only semantic difference is that we now apply
  journalApplyCommodityStyles before running journalCheckAccountsDeclared
  and journalCheckCommoditiesDeclared.

- Introduce lenses for ReportOpts and ReportSpec. (Stephen Morgan)

- Rename the fields of ReportSpec. (Stephen Morgan)

  This is done to be more consistent with future field naming conventions,
  and to make automatic generation of lenses simpler. See discussion in
  [#1545](https://github.com/simonmichael/hledger/issues/1545).

      rsOpts      -> _rsReportOpts
      rsToday     -> _rsDay
      rsQuery     -> _rsQuery
      rsQueryOpts -> _rsQueryOpts

- Remove aismultiplier from Amount. (Stephen Morgan)

  In Amount, aismultiplier is a boolean flag that will always be False,
  except for in TMPostingRules, where it indicates whether the posting
  rule is a multiplier. It is therefore unnecessary in the vast majority
  of cases. This posting pulls this flag out of Amount and puts it into
  TMPostingRule, so it is only kept around when necessary.

  This changes the parsing of journals somewhat. Previously you could
  include an * before an amount anywhere in a Journal, and it would
  happily parse and set the aismultiplier flag true. This will now fail
  with a parse error: * is now only acceptable before an amount within an
  auto posting rule.

  Any usage of the library in which the aismultiplier field is read or set
  should be removed. If you truly need its functionality, you should
  switch to using TMPostingRule.

  This changes the JSON output of Amount, as it will no longer include
  aismultiplier.

- For accountTransactionsReport, generate the overall reportq from the ReportSpec, rather than being supplied as a separate option. (Stephen Morgan)

  This is the same approach used by the other reports, e.g. EntryReport,
  PostingReport, MultiBalanceReport. This reduces code duplication, as
  previously the reportq had to be separately tweaked in each of 5
  different places.

  If you call accountTransactionreport, there is no need to separately
  derive the report query.

- Remove unused TransactionReport. Move the useful utility functions to AccountTransactionsReport. (Stephen Morgan)

  If you use transactionsReport, you should either use entryReport if you
  don't require a running total, or using accountTransactionsReport with
  thisacctq as Any or None (depending on what you want included in the
  running total).

- Some balance report types have been renamed for clarity and to sync with docs:

      ReportType -> BalanceCalculation
       ChangeReport -> CalcChange
       BudgetReport -> CalcBudget
       ValueChangeReport -> CalcValueChange

      BalanceType -> BalanceAccumulation
       PeriodChange -> PerPeriod
       CumulativeChange -> Cumulative
       HistoricalBalance -> Historical

      ReportOpts:
       reporttype_ -> balancecalc_
       balancetype_ -> balanceaccum_

      CompoundBalanceCommandSpec:
       cbctype -> cbcaccum

      Hledger.Reports.ReportOptions:
       balanceTypeOverride -> balanceAccumulationOverride

# 1.22.2 2021-08-07

- forecast_ has moved from ReportOpts to InputOpts. (Stephen Morgan)

- Generate forecast transactions at journal finalisation, rather than as a postprocessing step.
  This allows us to have a uniform procedure for balancing transactions,
  whether they are normal transactions or forecast transactions, including
  dealing with balance assignments, balance assertions, and auto postings.
  ([#1638](https://github.com/simonmichael/hledger/issues/1638), Stephen Morgan)

# 1.22.1 2021-08-02

- Allow megaparsec 9.1

- journalEndDate's behaviour has been clarified, journalLastDay has
  been added.

- transactionCheckBalanced is now exported. (#1596)

# 1.22 2021-07-03

- GHC 9.0 is now officially supported, and GHC 8.0, 8.2, 8.4 are not;
  building hledger now requires GHC 8.6 or greater.

- Added now-required lower bound on containers. (#1514)

- Added useColor, colorOption helpers usable in pure code, eg for debug output.

- Added a Show instance for AmountDisplayOpts and WideBuilder, for debug logging.

Many internal refactorings/improvements/optimisations by Stephen Morgan,
including:

- Don't infer a txn price with same-sign amounts. (#1551)

- Clean up valuation functions, and make clear which to use where. (#1560)

- Replace journalSelectingAmountFromOpts with journalApplyValuationFromOpts.
  This also has the effect of allowing valuation in more reports, for
  example the transactionReport.

- Refactor to eliminate use of printf.

- Remove unused String, Text utility functions.

- Replace concat(Top|Bottom)Padded with textConcat(Top|Bottom)Padded.

- Export Text.Tabular from Text.Tabular.AsciiWide, clean up import lists.

- When matching an account query against a posting, don't try to match
  against the same posting twice, in cases when poriginal is Nothing.

- Create mixedAmountApplyValuationAfterSumFromOptsWith for doing any
  valuation needed after summing amounts.

- Create journalApplyValuationFromOpts. This does costing and
  valuation on a journal, and is meant to replace most direct calls of
  costing and valuation. The exception is for reports which require
  amounts to be summed before valuation is applied, for example a
  historical balance report with --value=end.

- Remove unused (amount|mixedAmount|posting|transaction)ApplyCostValuation functions.

- Remove unnecessary normalisedMixedAmount.

- Remove `showAmounts*B` functions, replacing them entirely with
  `showMixedAmount*B` functions.

- Pull "show-costs" option used by the Close command up into ReporOpts.

- Add more efficient toEncoding for custom ToJSON declarations.

- Fix ledgerDateSpan, so that it considers both transaction and
  posting dates. (#772)

- Move reportPeriodName to Hledger.Reports.ReportOptions, use it for
  HTML and CSV output for compound balance reports.

- Simplify the JSON representation of AmountPrecision. It now uses the
  same JSON representation as Maybe Word8. This means that the JSON
  serialisation is now broadly compatible with that used before the
  commit f6fa76bba7530af3be825445a1097ae42498b1cd, differing only in
  how it handles numbers outside Word8 and that it can now produce
  null for NaturalPrecision.

- A number of AccountName and Journal functions which are supposed to
  produce unique sorted results now use Sets internally to be slightly
  more efficient. There is also a new function journalCommodities.

- More efficiently check whether Amounts are or appear to be zero.
  Comparing two Quantity (either with == or compare) does a lot of
  normalisation (calling roundMax) which is unnecessary if we're
  comparing to zero. Do things more directly to save work.
  For `reg -f examples/10000x10000x10.journal`, this results in

  - A 12% reduction in heap allocations, from 70GB to 62GB
  - A 14% reduction in (profiled) time, from 79s to 70s

  Results for bal -f examples/10000x10000x10.journal are of the same
  order of magnitude.

- In sorting account names, perform lookups on HashSets and HashMaps,
  rather than lists. This is probably not an enormous performance sink
  in real situations, but it takes a huge amount of time and memory in
  our benchmarks (specifically 10000x10000x10.journal). For 
  `bal -f examples/10000x10000x10.journal`, this results in

  - A 23% reduction in heap allocation, from 27GiB to 21GiB
  - A 33% reduction in (profiled) time running, from 26.5s to 17.9s

- Minor refactor, using foldMap instead of asum . map . toList.

- Do not call showAmount twice for every posting. For print -f
  examples/10000x10000x10.journal, this results in a 7.7% reduction in
  heap allocations, from 7.6GB to 7.1GB.

- Some efficiency improvements in register reports.
  Use renderRow interface for Register report.

  For `reg -f examples/10000x10000x10.journal`, this results in:

  - Heap allocations decreasing by 55%, from 68.6GB to 31.2GB
  - Resident memory decreasing by 75%, from 254GB to 65GB
  - Total (profiled) time decreasing by 55%, from 37s to 20s

- Split showMixedAmountB into showMixedAmountB and showAmountsB, the
  former being a simple wrapper around the latter. This removes the
  need for the showNormalised option, as showMixedAmountB will always
  showNormalised and showAmountsB will never do so.

- Change internal representation of MixedAmount to use a strict Map
  instead of a list of Amounts. No longer export Mixed constructor, to
  keep API clean. (If you really need it, you can import it directly
  from Hledger.Data.Types). We also ensure the JSON representation of
  MixedAmount doesn't change: it is stored as a normalised list of
  Amounts.
  
  This commit improves performance. Here are some indicative results:

      hledger reg -f examples/10000x1000x10.journal
      - Maximum residency decreases from 65MB to 60MB (8% decrease)
      - Total memory in use decreases from 178MiB to 157MiB (12% decrease)

      hledger reg -f examples/10000x10000x10.journal
      - Maximum residency decreases from 69MB to 60MB (13% decrease)
      - Total memory in use decreases from 198MiB to 153MiB (23% decrease)

      hledger bal -f examples/10000x1000x10.journal
      - Total heap usage decreases from 6.4GB to 6.0GB (6% decrease)
      - Total memory in use decreases from 178MiB to 153MiB (14% decrease)

      hledger bal -f examples/10000x10000x10.journal
      - Total heap usage decreases from 7.3GB to 6.9GB (5% decrease)
      - Total memory in use decreases from 196MiB to 185MiB (5% decrease)

      hledger bal -M -f examples/10000x1000x10.journal
      - Total heap usage decreases from 16.8GB to 10.6GB (47% decrease)
      - Total time decreases from 14.3s to 12.0s (16% decrease)

      hledger bal -M -f examples/10000x10000x10.journal
      - Total heap usage decreases from 108GB to 48GB (56% decrease)
      - Total time decreases from 62s to 41s (33% decrease)

  If you never directly use the constructor Mixed or pattern match against
  it then you don't need to make any changes. If you do, then do the
  following:

  - If you really care about the individual Amounts and never normalise
    your MixedAmount (for example, just storing `Mixed amts` and then
    extracting `amts` as a pattern match, then use should switch to using
    [Amount]. This should just involve removing the `Mixed` constructor.
  - If you ever call `mixed`, `normaliseMixedAmount`, or do any sort of
    amount arithmetic (+), (-), then you should replace the constructor
    `Mixed` with the function `mixed`. To extract the list of Amounts, use
    the function `amounts`.
  - Any remaining calls to `normaliseMixedAmount` can be removed, as that
    is now the identity function.

- Create a new API for MixedAmount arithmetic. This should supplant
  the old interface, which relied on the Num typeclass. MixedAmount
  did not have a very good Num instance. The only functions which were
  defined were fromInteger, (+), and negate. Furthermore, it was not
  law-abiding, as 0 + a /= a in general. Replacements for used
  functions are:

      0 -> nullmixedamt / mempty
      (+) -> maPlus / (<>)
      (-) -> maMinus
      negate -> maNegate
      sum -> maSum
      sumStrict -> maSum

  Also creates some new constructors for MixedAmount:

      mixedAmount :: Amount -> MixedAmount
      maAddAmount :: MixedAmount -> Amount -> MixedAmount
      maAddAmounts :: MixedAmount -> [Amount] -> MixedAmount

  Add Semigroup and Monoid instances for MixedAmount.
  Ideally we would remove the Num instance entirely.

  The only change needed have nullmixedamt/mempty substitute for 0
  without problems was to not squash prices in
  mixedAmount(Looks|Is)Zero. This is correct behaviour in any case.


# 1.21 2021-03-10

- Building Hledger.Data.Journal no longer fails if the monad-extras
  package is installed.

- Many parts of the hledger-lib and hledger APIs have become more
  Text-ified, expecting or returning Text instead of String, reducing
  hledger's time and resident memory requirements by roughly 10%.
  Some functions now use WideBuilder (a text "builder" which keeps track
  of width), to concatenate text more efficiently. There are some
  helpers for converting to and from WideBuilder (wbUnpack, wbToText..)
  showAmountB/showMixedAmountB are new amount-displaying functions
  taking an AmountDisplayOpts. These will probably replace the old
  show(Mixed)Amount* functions. (#1427, Stephen Morgan)

- AtThen valuation is now implemented for all report types.
  amountApplyValuation now takes the posting date as an argument.
  (transaction/posting)ApplyValuation's valuation type and
  transaction/posting arguments have been reordered like
  amountApplyValuation's. (Stephen Morgan)

- Amount, AmountPrice, AmountStyle, DigitGroupStyle fields are now
  strict. (Stephen Morgan)

- Amount prices are now stored with their sign, so negative prices can
  be represented. (They seem to have always worked, but now the
  internal representation is more accurate.) (Stephen Morgan)
 
- normaliseMixedAmount now combines Amounts with TotalPrices in the
  same commodity. (Stephen Morgan)

- normaliseMixedAmount now uses a strict Map for combining amounts
  internally, closing a big space leak. (Stephen Morgan)

- (multiply|divide)(Mixed)?Amount now also multiply or divide the
  TotalPrice if it is present, and the old
  (multiply|divide)(Mixed)?AmountAndPrice functions are removed. (Stephen Morgan)

- (amount|mixedAmount)(Looks|Is)Zero functions now check whether both
  the quantity and the cost are zero. This is usually what you want,
  but if you do only want to check whether the quantity is zero, you
  can run mixedAmountStripPrices (or similar) before this. (Stephen Morgan)

- commodityStylesFromAmounts now consumes the list immediately,
  reducing the maximum heap size per thread from ~850K to ~430K in a
  real-world register report. (Stephen Morgan)

- *ApplyValuation functions take two less arguments, and
  *ApplyCostValuation functions have been added, performing both
  costing and valuation. (Stephen Morgan)

- traceAtWith now has a level argument and works properly.

- API changes include:
  ```
  Hledger.Data.Amount:
   setAmountPrecision -> amountSetPrecision
   setFullPrecision -> amountSetFullPrecision
   setMixedAmountPrecision -> mixedAmountSetPrecision
   showMixed -> showMixedAmountB
   showMixedLines -> showMixedAmountLinesB
  -mixedAmountSetFullPrecision

  Hledger.Data.Journal:
   mapJournalTransactions -> journalMapTransactions
   mapJournalPostings -> journalMapPostings
  -mapTransactionPostings
  +journalPayeesUsed
  +journalPayeesDeclaredOrUsed

  Hledger.Data.Transaction:
  +transactionFile
  +transactionMapPostings

  Hledger.Data.Valuation:
  -valuationTypeIsCost
  -valuationTypeIsDefaultValue
  -ValuationType's AtDefault constructor

  Hledger.Query:
  +matchesDescription
  +matchesPayeeWIP

  Hledger.Utils.Text:
  +textConcatBottomPadded
  +wbToText
  +wbUnpack

  Text.Tabular.AsciiWide:
   alignCell -> textCell
  ```
# 1.20.4 2021-01-29

- See hledger.

# 1.20.3 2021-01-14

- See hledger.

# 1.20.2 2020-12-28

- Fix the info manuals' node structure.

- Drop unused parsec dependency.

# 1.20.1 2020-12-15

- renamed: updateReportSpecFromOpts -> updateReportSpec[With]

# 1.20 2020-12-05

- added: journalApplyAliases, transactionApplyAliases, postingApplyAliases

- a new more robust price lookup implementation, fgl library dropped (#1402)

- Reverted a stripAnsi change in 1.19.1 that caused a 3x slowdown of amount rendering 
  in terminal reports. (#1350)

- Amount and table rendering has been improved, so that stripAnsi is no longer needed.
  This speeds up amount rendering in the terminal, speeding up some reports by 10% or more since 1.19.
  (Stephen Morgan)

- global commodity display styles can now be set in InputOpts or Journal,
  overriding all others (declared or inferred). This is used by the import
  command and probably command-line options in future.

- Journal keeps a new piece of parsing state, a decimal mark character,
  which can optionally be set to force the number format expected by all
  amount parsers.

- Remove Empty Query constructor, which does nothing and has done so for a very long time. (Stephen Morgan)

- In ReportOpts, store query terms term-by-term in a list in querystring_. (Stephen Morgan)
  This helps deal with tricky quoting issues, as we no longer have to make
  sure everything is quoted properly before merging it into a string.

- Implement concat(Top|Bottom)Padded in terms of renderRow, allowing them to be width aware. (Stephen Morgan)

- Expand Tabular.AsciiWide to allow multiline, custom-width,
  vertically/horizontally-aligned cells, and optional table borders.
  (Stephen Morgan)

- Introduce showMixed*Unnormalised, eliminate most direct calls of strWidth. (Stephen Morgan)

- showMixedAmountElided now makes better use of space, showing as many
  Amounts possible as long as they and the elision string fit within
  32 characters. (Stephen Morgan)

- Add Functor instance for CompoundPeriodicReport. (Stephen Morgan)

- Generalise CBCSubreportSpec to allow more subreport control. (Stephen Morgan)

- Export some MultiBalanceReport helper functions. (Stephen Morgan)

- Make Default instances clearer, remove Default instance for Bool. (Stephen Morgan)

- Many ReportOpts-related changes, such as the addition of ReportSpec, aimed
  at preventing runtime errors (from parsing: regexps, dates, format strings;
  from not having today's date set; etc.)
  ReportSpec holds a ReportOpts, the day of the report, and the Query generated from these.

- StringFormat now takes an optional overline width, which is
  currently only used by defaultBalanceLineFormat. (Stephen Morgan)

- quoteIfNeeded should not escape the backslashes in unicode code points. (Stephen Morgan)

- Export OrdPlus and constructors. (Stephen Morgan)

- Debug output now uses pretty-simple instead pretty-show.
  This hopefully gives overall nicer debug output (eg in colour), 
  including for values which don't have Read-able Show output.
  This means that we can start removing custom Show instances 
  that were a workaround for pretty-show. Eg account names
  in debug output no longer show their colons as underscores.

  Here's some old pretty-show output:

   CsvRules
     { rdirectives = [ ( "skip" , "1" ) ]
     , rcsvfieldindexes = [ ( "date" , 1 ) , ( "amount" , 2 ) ]
     , rassignments = [ ( "amount" , "%2" ) , ( "date" , "%1" ) ]
     , rconditionalblocks = []
     }

  And the new pretty-simple output:

   CsvRules
     { rdirectives=
       [ ( "skip", "1" ) ]
     , rcsvfieldindexes=
       [ ( "date", 1 ), ( "amount", 2 ) ]
     , rassignments=
       [ ( "amount", "%2" ), ( "date", "%1" ) ]
     , rconditionalblocks= []
     }

  We require pretty-simple 4.0.0.0 to get this compact output.
  It's a little less compact than pretty-show, but not too bad.
  Non-compact pretty-simple output would be:

   CsvRules
       { rdirectives=
           [
               ( "skip"
               , "1B"
               )
           ]
       , rcsvfieldindexes=
           [
               ( "date"
               , 1
               )
           ,
               ( "amount"
               , 2
               )
           ]
       , rassignments=
           [
               ( "amount"
               , "%2"
               )
           ,
               ( "date"
               , "%1"
               )
           ]
       , rconditionalblocks=[]
       }


# 1.19.1 2020-09-07

- Allow megaparsec 9

- stripAnsi: correctly strip ansi sequences with no
  numbers/semicolons. (Stephen Morgan)

- Added case-insensitive accountNameToAccountRegexCI,
  accountNameToAccountOnlyRegexCI, made the default account type
  queries case insensitive again. (#1341)

# 1.19 2020-09-01

- Added a missing lower bound for aeson, making cabal installs more
  reliable. (#1268)

- The Regex type alias has been replaced by the Regexp ADT, which
  contains both the compiled regular expression (so is guaranteed to
  be usable at runtime) and the original string (so can be serialised,
  printed, compared, etc.) A Regexp also knows whether is it case
  sensitive or case insensitive. The Hledger.Utils.Regex API has
  changed. (#1312, #1330).

- Typeable and Data instances are no longer derived for hledger's
  data types; they were redundant/no longer needed.

- NFData instances are no longer derived for hledger's data types.
  This speeds up a full build by roughly 7%. But it means we can't
  deep-evaluate hledger values, or time hledger code with Criterion.
  https://github.com/simonmichael/hledger/pull/1330#issuecomment-684075129
  has some ideas on this.

- Query no longer has a custom Show instance

- Hledger.Utils.String: quoteIfNeeded now actually escapes quotes in
  strings. escapeQuotes was dropped. (Stephen Morgan)

- Hledger.Utils.Tree: dropped some old utilities

- Some fromIntegral calls have been replaced with safer code, removing
  some potential for integer wrapping bugs (#1325, #1326)

- Parsing numbers with more than 255 decimal places now gives an error
  instead of silently misparsing (#1326)

- Digit groups are now limited to at most 255 digits each. (#1326)

- Exponents are parsed as Integer rather than Int.
  This means exponents greater than 9223372036854775807 or less than
  -9223372036854775808 are now parsed correctly, in theory. (In
  practice, very large exponents will cause hledger to eat all your
  memory, so avoid them for now.) (#1326)

- AmountStyle's asprecision is now a sum type with Word8, instead of
  an Int with magic values.

- DigitGroupStyle uses Word8 instead of Int.

- Partial helper function parsedate has been dropped, use fromGregorian instead.

- Partial helper function mkdatespan has been dropped.

- Helper function transaction now takes a Day instead of a date string. (Stephen Morgan)

- Old CPP directives made redundant by version bounds have been
  removed. (Stephen Morgan)

- Smart dates are now represented by the SmartDate type, and are
  always well formed. (Stephen Morgan)

- accountTransactionsReport (used for hledger aregister and
  hledger-ui/hledger-web registers) now filters transactions more
  thoroughly, so eg transactions dated outside the report period will
  not be shown. Previously the transaction would be shown if it had
  any posting dated inside the report period. Possibly some other
  filter criteria now get applied that didn't before. I think on
  balance this will give slightly preferable results.

- The old BalanceReport code has been dropped at last, replaced by
  MultiBalanceReport so that all balance reports now use the same
  code. (Stephen Morgan, #1256).

  - The large multiBalanceReport function has been split up and refactored
    extensively.
  - Tabular data formerly represented as [[MixedAmount]] is now HashMap
    AccountName (Map DateSpan Account). Reports with many columns are now faster.
  - Calculating starting balances no longer calls the whole balanceReport,
    just the first few functions.
  - displayedAccounts is completely rewritten. Perhaps one subtle thing to
    note is that in tree mode it no longer excludes nodes with zero inclusive
    balance unless they also have zero exclusive balance.
  - Simon's note: "I'll mark the passing of the old multiBalanceReport, into
    which I poured many an hour :). It is in a way the heart (brain ?) of
    hledger - the key feature of ledgerlikes (balance report) and a key
    improvement introduced by hledger (tabular multiperiod balance reports)
    ...
    Thanks @Xitian9, great work."

# 1.18.1 2020-06-21

- fix some doc typos (Martin Michlmayr)

# 1.18 2020-06-07

- added: getHledgerCliOpts', takes an explicit argument list

- added: toJsonText

- changed: isNegativeMixedAmount now gives an answer for
  multi-commodity amounts which are all negative

- changed: multiBalanceReport now gets the query from ReportOpts (Dmitry Astapov)

- renamed:
  isZeroAmount                -> amountLooksZero
  isReallyZeroAmount          -> amountIsZero
  isZeroMixedAmount           -> mixedAmountLooksZero
  isReallyZeroMixedAmount     -> mixedAmountIsZero
  isReallyZeroMixedAmountCost dropped

- renamed: finaliseJournal -> journalFinalise

- renamed: fixedlotpricep -> lotpricep, now also parses non-fixed lot prices

- dropped: transactionPostingBalances

- dropped: outputflags no longer exported by Hledger.Cli.CliOptions

- fixed: documentation for journalExpenseAccountQuery (Pavan Rikhi)

# 1.17.1 2020-03-19

- require newer Decimal, math-functions libs to ensure consistent
  rounding behaviour, even when built with old GHCs/snapshots. 
  hledger uses banker's rounding (rounds to nearest even number, eg
  0.5 displayed with zero decimal places is "0").

- added: debug helpers traceAt, traceAtWith

- Journal is now a Semigroup, not a Monoid (since <> is right-biased). (Stephen Morgan)

# 1.17.0.1 2020-03-01

- fix org heading comments and doctest setup comment that were
  breaking haddock (and in some cases, installation)

# 1.17 2020-03-01

- Reader-finding utilities have moved from Hledger.Read to
  Hledger.Read.JournalReader so the include directive can use them.

- Reader changes:
  - rExperimental flag removed
  - old rParser renamed to rReadFn
  - new rParser field provides the actual parser.
    This seems to require making Reader a higher-kinded type, unfortunately.

- Hledger.Tabular.AsciiWide now renders smoother outer borders in
  pretty (unicode) mode.
  Also, a fix for table edges always using single-width intersections
  and support for double horizontal lines with single vertical lines. (Eric Mertens)

- Hledger.Utils.Parse: restofline can go to eof also

- Hledger.Read cleanup

- Hledger.Read.CsvReader cleanup
  Exports added: CsvRecord, CsvValue, csvFileFor.
  Exports removed: expandIncludes, parseAndValidateCsvRules, transactionFromCsvRecord

- more cleanup of amount canonicalisation helpers (#1187)
  Stop exporting journalAmounts, overJournalAmounts, traverseJournalAmounts.
  Rename journalAmounts helper to journalStyleInfluencingAmounts.

- export mapMixedAmount

- Don't store leaf name in PeriodReport. (Stephen Morgan)
  Calculate at the point of consumption instead.

- Generalise PeriodicReport to be polymorphic in the account labels. (Stephen Morgan)

- Use records instead of tuples in PeriodicReport. (Stephen Morgan)

- Use PeriodicReport in place of MultiBalanceReport. (Stephen Morgan)

- Calculate MultiReportBalance columns more efficiently. (Stephen Morgan)
  Only calculate posting date once for each posting, and calculate their
  columns instead of checking each DateSpan separately.

- Moved JSON instances from hledger-web to hledger-lib (Hledger.Data.Json),
  and added ToJSON instances for all (?) remaining data types, up to Ledger.

- Dropped nullassertion's "assertion" alias, fixing a warning.
  Perhaps we'll stick with the null* naming convention. 


# 1.16.2 2020-01-14

- add support for megaparsec 8 (#1175)

# 1.16.1 2019-12-03

- Drop unnecessary mtl-compat dependency

- Fix building with GHC 8.0, 8.2

# 1.16 2019-12-01

- drop support for GHC 7.10, due to MonadFail hassles in JournalReader.hs

- add support for GHC 8.8, base-compat 0.11 (#1090)

  We are now using the new fail from the MonadFail class, which we
  always import qualified as Fail.fail, from base-compat-batteries
  Control.Monad.Fail.Compat to work with old GHC versions. If old fail
  is needed (shouldn't be) it should be imported qualified as
  Prelude.Fail, using imports such as:

      import Prelude hiding (fail)
      import qualified Prelude (fail)
      import Control.Monad.State.Strict hiding (fail)
      import "base-compat-batteries" Prelude.Compat hiding (fail)
      import qualified "base-compat-batteries" Control.Monad.Fail.Compat as Fail

- hledger and hledger-lib unit tests have been ported to tasty.

- The doctest suite has been disabled for now since it doesn't run
  well with cabal (#1139)
  
# 1.15.2 2019-09-05

Changes:

- postingApplyValuation, mixedAmountApplyValuation, amountApplyValuation
  take an argument, the report end date if one was specified.

# 1.15.1 2019-09-02

- fix failing doctests

# 1.15 2019-09-01

Removals include:

- journalPrices
- BalanceHistoryReport
- postingValueAtDate

Additions include:

- MarketPrice (more pure form of PriceDirective without the amount style information)
- PriceOracle (efficient lookup of exchange rates)
- ValuationType (ways to convert amount value)
- aliasnamep (export)
- setNaturalPrecisionUpTo
- dbgNWith, ptraceAtWith
- postingTransformAmount, postingToCost, postingValue
- amountToCost, mixedAmountToCost
- valueTypeFromOpts
- mapJournalTransactions, mapJournalPostings, mapTransactionPostings
- journalStartDate, journalEndDate
- journalPriceOracle
- marketPriceReverse
- priceDirectiveToMarketPrice
- mixedAmountApplyValuation
- mixedAmountValueAtDate

Changes include:

- Price -> AmountPrice,  AKA "transaction price"
- old MarketPrice -> PriceDirective
- TransactionsReport/AccountTransactionsReport split into separate files
- journalTransactionsReport -> transactionsReport
- accountTransactionsReportItems: rewrite using catMaybes and mapAccumL (Henning Thielemann)
- optionally save the current date in ReportOpts
- Hledger.Cli tests now have correct prefix; add Cli.Utils tests
- MultiBalanceReport now returns zero for row totals when in cumulative or historical mode (#329)


# 1.14.1 2019-03-20

- require easytest <0.3 to fix build issue

# 1.14 2019-03-01

- added:  
  transaction, [v]post*, balassert* constructors, for tests etc.  

- renamed:  
  porigin -> poriginal  

- refactored:  
  transaction balancing & balance assertion checking (#438)

# 1.13.1 (2019/02/02)

- stop depending on here to avoid haskell-src-meta/stackage blockage.

# 1.13 (2019/02/01)

- in Journal's jtxns field, forecasted txns are appended rather than prepended

- API changes:

  added:
  +setFullPrecision
  +setMinimalPrecision
  +expectParseStateOn
  +embedFileRelative
  +hereFileRelative

  changed:
  - amultiplier -> aismultiplier
  - Amount fields reordered for clearer debug output
  - tpreceding_comment_lines -> tprecedingcomment, reordered
  - Hledger.Data.TransactionModifier.transactionModifierToFunction -> modifyTransactions
  - Hledger.Read.Common.applyTransactionModifiers -> Hledger.Data.Journal.journalModifyTransactions

  - HelpTemplate -> CommandDoc


# 1.12 (2018/12/02)

-   switch to megaparsec 7 (Alex Chen)
    We now track the stack of include files in Journal ourselves, since
    megaparsec dropped this feature.

-   add 'ExceptT' layer to our parser monad again (Alex Chen)
    We previously had a parser type, 'type ErroringJournalParser = ExceptT
    String ...' for throwing parse errors without allowing further
    backtracking. This parser type was removed under the assumption that it
    would be possible to write our parser without this capability. However,
    after a hairy backtracking bug, we would now prefer to have the option to
    prevent backtracking.

    -   Define a 'FinalParseError' type specifically for the 'ExceptT' layer
    -   Any parse error can be raised as a "final" parse error
    -   Tracks the stack of include files for parser errors, anticipating the
        removal of the tracking of stacks of include files in megaparsec 7
        -   Although a stack of include files is also tracked in the 'StateT
            Journal' layer of the parser, it seems easier to guarantee correct
            error messages in the 'ExceptT FinalParserError' layer
        -   This does not make the 'StateT Journal' stack redundant because the
            'ExceptT FinalParseError' stack cannot be used to detect cycles of
            include files

-   more support for location-aware parse errors when re-parsing (Alex Chen)

-   make 'includedirectivep' an 'ErroringJournalParser' (Alex Chen)

-   drop Ord instance breaking GHC 8.6 build (Peter Simons)

-   flip the arguments of (divide\|multiply)\[Mixed\]Amount

-   showTransaction: fix a case showing multiple missing amounts
    showTransaction could sometimes hide the last posting's amount even if
    one of the other posting amounts was already implicit, producing invalid
    transaction output.

-   plog, plogAt: add missing newline

-   split up journalFinalise, reorder journal finalisation steps (#893) (Jesse Rosenthal)
    The `journalFinalise` function has been split up, allowing more granular
    control.

-   journalSetTime --> journalSetLastReadTime

-   journalSetFilePath has been removed, use journalAddFile instead

# 1.11.1 (2018/10/06)

-   add, lib: fix wrong transaction rendering in balance assertion errors
    and when using the add command

# 1.11 (2018/9/30)

-   compilation now works when locale is unset (#849)

-   all unit tests have been converted from HUnit+test-framework to easytest

-   doctests now run quicker by default, by skipping reloading between tests.
    This can be disabled by passing --slow to the doctests test suite
    executable.

-   doctests test suite executable now supports --verbose, which shows
    progress output as tests are run if doctest 0.16.0+ is installed
    (and hopefully is harmless otherwise).

-   doctests now support file pattern arguments, provide more informative output.
    Limiting to just the file(s) you're interested can make doctest start
    much quicker. With one big caveat: you can limit the starting files,
    but it always imports and tests all other local files those import.

-   a bunch of custom Show instances have been replaced with defaults,
    for easier troubleshooting. These were sometimes obscuring
    important details, eg in test failure output. Our new policy is:
    stick with default derived Show instances as far as possible, but
    when necessary adjust them to valid haskell syntax so pretty-show
    can pretty-print them (eg when they contain Day values, cf
    https://github.com/haskell/time/issues/101). By convention, when
    fields are shown in less than full detail, and/or in double-quoted
    pseudo syntax, we show a double period (..) in the output.

-   Amount has a new Show instance. Amount's show instance hid
    important details by default, and showing more details required
    increasing the debug level, which was inconvenient. Now it has a
    single show instance which shows more information, is fairly
    compact, and is pretty-printable.

        ghci> usd 1
        OLD:
        Amount {acommodity="$", aquantity=1.00, ..}
        NEW:
        Amount {acommodity = "$", aquantity = 1.00, aprice = NoPrice, astyle = AmountStyle "L False 2 Just '.' Nothing..", amultiplier = False}

    MixedAmount's show instance is unchanged, but showMixedAmountDebug
    is affected by this change:

        ghci> putStrLn $ showMixedAmountDebug $ Mixed [usd 1]
        OLD:
        Mixed [Amount {acommodity="$", aquantity=1.00, aprice=, astyle=AmountStyle {ascommodityside = L, ascommodityspaced = False, asprecision = 2, asdecimalpoint = Just '.', asdigitgroups = Nothing}}]
        NEW:
        Mixed [Amount {acommodity="$", aquantity=1.00, aprice=, astyle=AmountStyle "L False 2 Just '.' Nothing.."}]

-   Same-line & next-line comments of transactions, postings, etc.
    are now parsed a bit more precisely (followingcommentp).
    Previously, parsing no comment gave the same result as an empty
    comment (a single newline); now it gives an empty string.\
    Also, and perhaps as a consequence of the above, when there's no
    same-line comment but there is a next-line comment, we'll insert an
    empty first line, since otherwise next-line comments would get moved
    up to the same line when rendered.

-   Hledger.Utils.Test exports HasCallStack

-   queryDateSpan, queryDateSpan' now intersect date AND'ed date spans
    instead of unioning them, and docs are clearer.

-   pushAccount -> pushDeclaredAccount

-   jaccounts -> jdeclaredaccounts

-   AutoTransaction.hs -> PeriodicTransaction.hs & TransactionModifier.hs

-   Hledger.Utils.Debug helpers have been renamed/cleaned up

# 1.10 (2018/6/30)

-   build cleanly with all supported GHC versions again (7.10 to 8.4)

-   support/use latest base-compat (#794)

-   support/require megaparsec 6.4+

-   extensive refactoring and cleanup of parsers and related types and utilities

-   readJournalFile(s) cleanup, these now use InputOpts

-   doctests now run a bit faster (#802)

# 1.9.1 (2018/4/30)

-   new generic PeriodicReport, and some report-related type aliases

-   new BudgetReport

-   make (readJournal\|tryReader)s?WithOpts the default api, dropping "WithOpts"

-   automated postings and command line account aliases happen earlier
    in journal processing (see hledger changelog)

# 1.9 (2018/3/31)

-   support ghc 8.4, latest deps

-   when the system text encoding is UTF-8, ignore any UTF-8 BOM prefix
    found when reading files.

-   CompoundBalanceReport amounts are now normally positive.
    The bs/bse/cf/is commands now show normal income, liability and equity
    balances as positive. Negative numbers now indicate a contra-balance
    (eg an overdrawn checking account), a net loss, a negative net worth,
    etc. This makes these reports more like conventional financial
    statements, and easier to read and share with others. (experimental)

-   splitSpan now returns no spans for an empty datespan

-   don't count periodic/modifier txns in Journal debug output

-   lib/ui/web/api: move embedded manual files to extra-source-files

-   Use skipMany/skipSome for parsing spacenonewline (Moritz Kiefer)
    This avoids allocating the list of space characters only to then
    discard it.

-   rename, clarify purpose of balanceReportFromMultiBalanceReport

-   fix some hlint warnings

-   add some easytest tests

# 1.5 (2017/12/31)

-   -V/--value uses today's market prices by default, not those of last transaction date. #683, #648)

-   csv: allow balance assignment (balance assertion only, no amount) in csv records (Nadrieril)

-   journal: allow space as digit group separator character, #330 (Mykola Orliuk)

-   journal: balance assertion errors now show line of failed assertion posting, #481 (Sam Jeeves)

-   journal: better errors for directives, #402 (Mykola Orliuk)

-   journal: better errors for included files, #660 (Mykola Orliuk)

-   journal: commodity directives in parent files are inherited by included files, #487 (Mykola Orliuk)

-   journal: commodity directives limits precision even after -B, #509 (Mykola Orliuk)

-   journal: decimal point/digit group separator chars are now inferred from an applicable commodity directive or default commodity directive. #399, #487 (Mykola Orliuk)

-   journal: numbers are parsed more strictly (Mykola Orliuk)

-   journal: support Ledger-style automated postings, enabled with --auto flag (Dmitry Astapov)

-   journal: support Ledger-style periodic transactions, enabled with --forecast flag (Dmitry Astapov)

-   period expressions: fix "nth day of {week,month}", which could generate wrong intervals (Dmitry Astapov)

-   period expressions: month names are now case-insensitive (Dmitry Astapov)

-   period expressions: stricter checking for invalid expressions (Mykola Orliuk)

-   period expressions: support "every 11th Nov" (Dmitry Astapov)

-   period expressions: support "every 2nd Thursday of month" (Dmitry Astapov)

-   period expressions: support "every Tuesday", short for "every <n>th day of week" (Dmitry Astapov)

-   remove upper bounds on all but hledger* and base (experimental)
    It's rare that my deps break their api or that newer versions must
    be avoided, and very common that they release new versions which I
    must tediously and promptly test and release hackage revisions for
    or risk falling out of stackage. Trying it this way for a bit.

# 1.4 (2017/9/30)

-   add readJournalFile\[s\]WithOpts, with simpler arguments and support
    for detecting new transactions since the last read.

-   query: add payee: and note: query terms, improve description/payee/note docs (Jakub Zárybnický, Simon Michael, #598, #608)

-   journal, cli: make trailing whitespace significant in regex account aliases
    Trailing whitespace in the replacement part of a regular expression
    account alias is now significant. Eg, converting a parent account to
    just an account name prefix: --alias '/:acct:/=:acct'

-   timedot: allow a quantity of seconds, minutes, days, weeks, months
    or years to be logged as Ns, Nm, Nd, Nw, Nmo, Ny

-   csv: switch the order of generated postings, so account1 is first.
    This simplifies things and facilitates future improvements.

-   csv: show the "creating/using rules file" message only with --debug

-   csv: fix multiple includes in one rules file

-   csv: add "newest-first" rule for more robust same-day ordering

-   deps: allow ansi-terminal 0.7

-   deps: add missing parsec lower bound, possibly related to #596, fpco/stackage#2835

-   deps: drop oldtime flag, require time 1.5+

-   deps: remove ghc < 7.6 support, remove obsolete CPP conditionals

-   deps: fix test suite with ghc 8.2

# 1.3.1 (2017/8/25)

-   Fix a bug with -H showing nothing for empty periods (#583, Nicholas Niro)
    This patch fixes a bug that happened when using the -H option on
    a period without any transaction. Previously, the behavior was no
    output at all even though it should have shown the previous ending balances
    of past transactions. (This is similar to previously using -H with -E,
    but with the extra advantage of not showing empty accounts)

-   allow megaparsec 6 (#594)

-   allow megaparsec-6.1 (Hans-Peter Deifel)

-   fix test suite with Cabal 2 (#596)

# 1.3 (2017/6/30)

journal: The "uncleared" transaction/posting status, and associated UI flags
and keys, have been renamed to "unmarked" to remove ambiguity and
confusion. This means that we have dropped the `--uncleared` flag,
and our `-U` flag now matches only unmarked things and not pending
ones. See the issue and linked mail list discussion for more
background. (#564)

csv: assigning to the "balance" field name creates balance
assertions (#537, Dmitry Astapov).

csv: Doubled minus signs are handled more robustly (fixes #524, Nicolas Wavrant, Simon Michael)

Multiple "status:" query terms are now OR'd together. (#564)

deps: allow megaparsec 5.3.

# 1.2 (2017/3/31)

## journal format

A pipe character can optionally be used to delimit payee names in
transaction descriptions, for more accurate querying and pivoting by
payee. Eg, for a description like `payee name | additional notes`,
the two parts will be accessible as pseudo-fields/tags named `payee`
and `note`.

Some journal parse errors now show the range of lines involved, not just the first.

## ledger format

The experimental `ledger:` reader based on the WIP ledger4 project has
been disabled, reducing build dependencies.

## Misc

Fix a bug when tying the knot between postings and their parent transaction, reducing memory usage by about 10% (#483) (Mykola Orliuk)

Fix a few spaceleaks (#413) (Moritz Kiefer)

Add Ledger.Parse.Text to package.yaml, fixing a potential build failure.

Allow megaparsec 5.2 (#503)

Rename optserror -> usageError, consolidate with other error functions

# 1.1 (2016/12/31)

## journal format

-   balance assignments are now supported (#438, #129, #157, #288)

    This feature also brings a slight performance drop (\~5%);
    optimisations welcome.

-   also recognise `*.hledger` files as hledger journal format

## ledger format

-   use ledger-parse from the ledger4 project as an alternate reader for C++ Ledger journals

    The idea is that some day we might get better compatibility with Ledger files this way.
    Right now this reader is not very useful and will be used only if you explicitly select it with a `ledger:` prefix.
    It parses transaction dates, descriptions, accounts and amounts, and ignores everything else.
    Amount parsing is delegated to hledger's journal parser, and malformed amounts might be silently ignored.

    This adds at least some of the following as new dependencies for hledger-lib:
    parsers, parsec, attoparsec, trifecta.

## misc

-   update base lower bound to enforce GHC 7.10+

    hledger-lib had a valid install plan with GHC 7.8, but currently requires GHC 7.10 to compile.
    Now we require base 4.8+ everywhere to ensure the right GHC version at the start.

-   Hledger.Read api cleanups

-   rename dbgIO to dbg0IO, consistent with dbg0, and document a bug in dbg*IO

-   make readJournalFiles \[f\] equivalent to readJournalFile f (#437)

-   more general parser types enabling reuse outside of IO (#439)

# 1.0.1 (2016/10/27)

-   allow megaparsec 5.0 or 5.1

# 1.0 (2016/10/26)

## timedot format

-   new "timedot" format for retroactive/approximate time logging.

    Timedot is a plain text format for logging dated, categorised
    quantities (eg time), supported by hledger. It is convenient
    for approximate and retroactive time logging, eg when the
    real-time clock-in/out required with a timeclock file is too
    precise or too interruptive. It can be formatted like a bar
    chart, making clear at a glance where time was spent.

## timeclock format

-   renamed "timelog" format to "timeclock", matching the emacs package

-   sessions can no longer span file boundaries (unclocked-out

    sessions will be auto-closed at the end of the file).

-   transaction ids now count up rather than down (#394)

-   timeclock files no longer support default year directives

-   removed old code for appending timeclock transactions to journal transactions.

    A holdover from the days when both were allowed in one file.

## csv format

-   fix empty field assignment parsing, rule parse errors after megaparsec port (#407) (Hans-Peter Deifel)

## journal format

-   journal files can now include timeclock or timedot files (#320)

    (but not yet CSV files).

-   fixed an issue with ordering of same-date transactions included from other files

-   the "commodity" directive and "format" subdirective are now supported, allowing

    full control of commodity style (#295) The commodity directive's
    format subdirective can now be used to override the inferred
    style for a commodity, eg to increase or decrease the
    precision. This is at least a good workaround for #295.

-   Ledger-style "apply account"/"end apply account" directives are now used to set a default parent account.

-   the Ledger-style "account" directive is now accepted (and ignored).

-   bracketed posting dates are more robust (#304)

    Bracketed posting dates were fragile; they worked only if you
    wrote full 10-character dates. Also some semantics were a bit
    unclear. Now they should be robust, and have been documented
    more clearly. This is a legacy undocumented Ledger syntax, but
    it improves compatibility and might be preferable to the more
    verbose "date:" tags if you write posting dates often (as I do).
    Internally, bracketed posting dates are no longer considered to
    be tags. Journal comment, tag, and posting date parsers have
    been reworked, all with doctests.

-   balance assertion failure messages are clearer

-   with --debug=2, more detail about balance assertions is shown.

## misc

-   file parsers have been ported from Parsec to Megaparsec \o/ (#289, #366) (Alexey Shmalko, Moritz Kiefer)

-   most hledger types have been converted from String to Text, reducing memory usage by 30%+ on large files

-   file parsers have been simplified for easier troubleshooting (#275).

    The journal/timeclock/timedot parsers, instead of constructing
    opaque journal update functions which are later applied to build
    the journal, now construct the journal directly by modifying the
    parser state. This is easier to understand and debug. It also
    rules out the possibility of journal updates being a space
    leak. (They weren't, in fact this change increased memory usage
    slightly, but that has been addressed in other ways). The
    ParsedJournal type alias has been added to distinguish
    "being-parsed" journals and "finalised" journals.

-   file format detection is more robust.

    The Journal, Timelog and Timedot readers' detectors now check
    each line in the sample data, not just the first one. I think the
    sample data is only about 30 chars right now, but even so this
    fixed a format detection issue I was seeing.
    Also, we now always try parsing stdin as journal format (not just sometimes).

-   all file formats now produce transaction ids, not just journal (#394)

-   git clone of the hledger repo on windows now works (#345)

-   added missing benchmark file (#342)

-   our stack.yaml files are more compatible across stack versions (#300)

-   use newer file-embed to fix ghci working directory dependence (<https://github.com/snoyberg/file-embed/issues/18>)

-   report more accurate dates in account transaction report when postings have their own dates

    (affects hledger-ui and hledger-web registers).
    The newly-named "transaction register date" is the date to be
    displayed for that transaction in a transaction register, for
    some current account and filter query. It is either the
    transaction date from the journal ("transaction general date"),
    or if postings to the current account and matched by the
    register's filter query have their own dates, the earliest of
    those posting dates.

-   simplify account transactions report's running total.

    The account transactions report used for hledger-ui and -web
    registers now gives either the "period total" or "historical
    total", depending strictly on the --historical flag. It doesn't
    try to indicate whether the historical total is the accurate
    historical balance (which depends on the user's report query).

-   reloading a file now preserves the effect of options, query arguments etc.

-   reloading a journal should now reload all included files as well.

-   the Hledger.Read.* modules have been reorganised for better reuse.

    Hledger.Read.Utils has been renamed Hledger.Read.Common
    and holds low-level parsers & utilities; high-level read
    utilities are now in Hledger.Read.

-   clarify amount display style canonicalisation code and terminology a bit.

    Individual amounts still have styles; from these we derive
    the standard "commodity styles". In user docs, we might call
    these "commodity formats" since they can be controlled by the
    "format" subdirective in journal files.

-   Journal is now a monoid

-   expandPath now throws a proper IO error

-   more unit tests, start using doctest

0.27 (2015/10/30)

-   The main hledger types now derive NFData, which makes it easier to
    time things with criterion.

-   Utils has been split up more.

-   Utils.Regex: regular expression compilation has been memoized, and
    memoizing versions of regexReplace\[CI\] have been added, since
    compiling regular expressions every time seems to be quite
    expensive (#244).

-   Utils.String: strWidth is now aware of multi-line strings (#242).

-   Read: parsers now use a consistent p suffix.

-   New dependencies: deepseq, uglymemo.

-   All the hledger packages' cabal files are now generated from
    simpler, less redundant yaml files by hpack, in principle. In
    practice, manual fixups are still needed until hpack gets better,
    but it's still a win.

0.26 (2015/7/12)

-   allow year parser to handle arbitrarily large years
-   Journal's Show instance reported one too many accounts
-   some cleanup of debug trace helpers
-   tighten up some date and account name parsers (don't accept leading spaces; hadddocks)
-   drop regexpr dependency

0.25.1 (2015/4/29)

-   support/require base-compat >0.8 (#245)

0.25 (2015/4/7)

-   GHC 7.10 compatibility (#239)

0.24.1 (2015/3/15)

-   fix JournalReader "ctx" compilation warning
-   add some type signatures in Utils to help make ghci-web

0.24 (2014/12/25)

-   fix combineJournalUpdates folding order
-   fix a regexReplaceCI bug
-   fix a splitAtElement bug with adjacent separators
-   mostly replace slow regexpr with regex-tdfa (fixes #189)
-   use the modern Text.Parsec API
-   allow transformers 0.4*
-   regexReplace now supports backreferences
-   Transactions now remember their parse location in the journal file
-   export Regexp types, disambiguate CsvReader's similarly-named type
-   export failIfInvalidMonth/Day (fixes #216)
-   track the commodity of zero amounts when possible
    (useful eg for hledger-web's multi-commodity charts)
-   show posting dates in debug output
-   more debug helpers

0.23.3 (2014/9/12)

-   allow transformers 0.4*

0.23.2 (2014/5/8)

-   postingsReport: also fix date sorting of displayed postings (#184)

0.23.1 (2014/5/7)

-   postingsReport: with disordered journal entries, postings before the
    report start date could get wrongly included. (#184)

0.23 (2014/5/1)

-   orDatesFrom -> spanDefaultsFrom

0.22.2 (2014/4/16)

-   display years before 1000 with four digits, not three
-   avoid pretty-show to build with GHC < 7.4
-   allow text 1.1, drop data-pprint to build with GHC 7.8.x

0.22.1 (2014/1/6) and older: see http://hledger.org/release-notes or doc/CHANGES.md.