Migrate testing/Main.hs to TestFramework
[packages/hoopl.git] / changelog.md
1 # Changelog for [`hoopl` package](http://hackage.haskell.org/package/hoopl)
2
3 ## 3.10.1.1 *Apr 2015*
4
5  - Add #if CABAL macro to several hoopl source files such that the Cabal generated macro is not included when building in ghci
6
7  - Change the test code (testing/*) to compare the converted graphs against the expected graphs in AST form 
8
9  - Update the cabal file to run tests and generate a test coverage report 
10  
11  - Unhide gSplice of Hoopl.Graph
12
13 ## 3.10.1.0 *Apr 2015*
14
15  - Re-export runWithFuel from Compiler.Hoopl.
16
17  - Remove redundant constraints
18
19 ## 3.10.0.2  *Dec 2014*
20
21  - Add support for `base-4.8.0.0` package version
22
23  - Mark a few modules as Safe rather than Trustworthy
24
25 ## 3.10.0.1  *Mar 2014*
26
27   - Remove UTF8 character from hoopl.cabal to workaround issue
28     in GHC 7.8.1's build system
29
30 ## 3.10.0.0  *Mar 2014*
31
32   - Bundled with GHC 7.8.1
33
34   - Define `Functor` and `Applicative` instances for
35      - `SimpleUniqueMonad`
36      - `CheckingFuelMonad`
37      - `InfiniteFuelMonad`
38      - `UniqueMonadT`
39      - `VM` (not exported)
40
41   - Update to Cabal format 1.10
42
43 ## 3.9.0.0
44
45 Lots of API changes; mainly a new API for working with Blocks
46
47 ### Summary of refactorings:
48
49    - `Compiler.Hoopl.Block` contains the `Block` datatype and all the
50      operations on Blocks.  It seemed like a good idea to collect all
51      this stuff together in one place.
52
53    - `Compiler.Hoopl.Graph` now has the operations on Graphs.
54
55    - `Compiler.Hoopl.Util` and `Compiler.Hoopl.GraphUtil` are no more; their
56      contents have been moved to other homes.  (and a bit of duplicated
57      functionality has been removed).
58
59    - I removed the newtypes around `Unique` and `Label`, these are now just
60      type synonyms.  The newtype wrappers were costing some performance in
61      GHC, because in cases like `mapToList` the newtype isn't optimised away.
62
63      This change might be controversial.  Feel free to complain.
64
65 ### Other changes:
66
67    - Optimisations to the Dataflow algorithms.  I'm not actually using
68      this implementation of Dataflow in GHC any more, instead I have a
69      local copy specialised to our monad, for speed.  Nevertheless I've
70      put some of the optimisations I'm using in the GHC version into the
71      generic library version too.
72
73 ### Summary of API changes:
74
75 #### Added
76
77   - `IsMap(mapInsertWith, mapFromListWith)`
78
79   - `mapGraphBlocks`
80     (was previously called `graphMapBlocks`, and not exported)
81
82   - `mapBlock'`
83     (strict version of `mapBlock`)
84
85   - New API for working with Blocks:
86
87     ```haskell
88       -- ** Predicates on Blocks
89     , isEmptyBlock
90  
91       -- ** Constructing blocks
92     , emptyBlock, blockCons, blockSnoc
93     , blockJoinHead, blockJoinTail, blockJoin, blockJoinAny
94     , blockAppend
95  
96       -- ** Deconstructing blocks
97     , firstNode, lastNode, endNodes
98     , blockSplitHead, blockSplitTail, blockSplit, blockSplitAny
99  
100       -- ** Modifying blocks
101     , replaceFirstNode, replaceLastNode
102  
103       -- ** Converting to and from lists
104     , blockToList, blockFromList
105  
106       -- ** Maps and folds
107     , mapBlock, mapBlock', mapBlock3'
108     , foldBlockNodesF, foldBlockNodesF3
109     , foldBlockNodesB, foldBlockNodesB3
110     ```
111
112 #### Removed
113
114   - `mapMaybeO`, `mapMaybeC`
115     (no need: we have `Functor` instances)
116
117   - Block constructors are no longer exported
118     (use the block API instead)
119
120   - `blockToNodeList`, `blockToNodeList'`, `blockToNodeList''`, `blockToNodeList'''`
121     (use the block API instead)
122
123   - `tfFoldBlock`, `ScottBlock`, `scottFoldBlock`, `fbnf3`,
124     `BlockResult(..)`, `lookupBlock`,
125     (I don't know what any of these are for, if they're still important
126     we could reinstate)
127
128 #### Changed
129
130   - Compiler.Hoopl.GHC is now Compiler.Hoopl.Internals and exports some
131     more stuff.
132
133   - Label is not a newtype; type Label = Unique
134   - Unique is not a newtype: type Unique = Int
135     (these newtypes were adding overhead)
136
137   - blockMapNodes3 is now mapBlock3'
138
139   - Lots of internal refactoring and tidying up
140
141 ## 3.8.7.4
142
143   - Re-export runWithFuel as per Justin Bailey
144
145 ## 3.8.7.3
146
147   - Uploaded to Hackage by Ian Lynagh; appears to contain updates
148     that use Safe Haskell if GHC >= 7.2 (thanks David Terei)
149
150 ## 3.8.7.2
151
152   - Version changed with no record of update; never uploaded to Hackage
153
154 ## 3.8.7.1
155
156   - Eliminate warning about nonexhaustive pattern match (thanks Edward Yang)
157
158 ## 3.8.7.0
159
160   - Works with GHC 7 (thanks Edward Yang)
161   - `cabal sdist` now sort of works (and is added to validate)
162
163 ## 3.8.6.0
164
165   - Matches the camera-ready Haskell'10 paper
166
167 ## 3.8.1.0
168
169   - Major reorganization per simonpj visit to Tufts 20 April 2010
170     Collections
171
172 ## 3.7.13.1
173
174   - Added function to fold over nodes in graph.
175
176 ## 3.7.13.0
177
178   - Pointed type replaces WithTop and WithBot, which are now synonyms.
179
180 ## 3.7.12.3
181
182 ### Interface changes
183
184 The type of AGraph is now abstract.
185 It is now recommended to create AGraphs with just three functions:
186
187     <*>          concatenation
188     |*><*|       splicing at a closed point
189     addBlocks    add C/C blocks out of line
190
191 There are new utility functions in modules Util and XUtil, all
192 exported by Compiler.Hoopl.  Here's a selection:
193
194     -- | A utility function so that a transfer function for a first
195     -- node can be given just a fact; we handle the lookup.  This
196     -- function is planned to be made obsolete by changes in the dataflow
197     -- interface.
198     firstXfer :: Edges n => (n C O -> f -> f) -> (n C O -> FactBase f -> f)
199     firstXfer xfer n fb = xfer n $ fromJust $ lookupFact fb $ entryLabel n
200
201     -- | This utility function handles a common case in which a transfer function
202     -- produces a single fact out of a last node, which is then distributed
203     -- over the outgoing edges.
204     distributeXfer :: Edges n => (n O C -> f -> f) -> (n O C -> f -> FactBase f)
205     distributeXfer xfer n f = mkFactBase [ (l, xfer n f) | l <- successors n ]
206
207     -- | This utility function handles a common case in which a transfer function
208     -- for a last node takes the incoming fact unchanged and simply distributes
209     -- that fact over the outgoing edges.
210     distributeFact :: Edges n => n O C -> f -> FactBase f
211
212     -- | Function 'graphMapBlocks' enables a change of representation of blocks,
213     -- nodes, or both.  It lifts a polymorphic block transform into a polymorphic
214     -- graph transform.  When the block representation stabilizes, a similar
215     -- function should be provided for blocks.
216     graphMapBlocks :: forall block n block' n' e x .
217                       (forall e x . block n e x -> block' n' e x)
218                    -> (Graph' block n e x -> Graph' block' n' e x)
219
220     postorder_dfs :: Edges (block n) => Graph' block n O x -> [block n C C]
221
222 There are quite a few other variations related to depth-first traversal.
223
224
225 There is a new module Compiler.Hoopl.Pointed, which uses GADTs to
226 enable you to add a Top or Bot element to a lattice, or both, all
227 using the same type.  (Types `WithBot` and `WithTop` in XUtil,
228 exported by Compiler.Hoopl, do similar jobs, but I think they are
229 inferior.  Your opinion is solicited.)
230
231 I added a function showGraph to print Graphs.  Right now it requires a
232 polymorphic node-showing function as argument. When we change the
233 Block representation we may get enough static type information that we
234 can simply have an instance declaration for
235
236     instance (Show n C O, Show n O O, Show n O C) => Show (Graph n e x)
237
238 At present, I don't see how to achieve such a declaration.
239
240 John added new functions `debugFwdJoins` and `debugBwdJoins` to extend
241 passes with debugging information.
242
243 We added primed versions of the analyzeAndRewrite functions, which
244 operate on Graph, not Body.  Recommended, at least for first-timers.
245
246 Not all maps keyed by Label are FactBases, so there is now a new set
247 of names of functions to manipulate LabelMaps that do not contain
248 dataflow facts.
249
250 ### Implementation changes
251
252 Split pass and rewrite-function combinators into Compiler.Hoopl.Combinators.
253
254 Changed order of blocks for forward and backward analysis.
255 These changes have not been tested, because we don't have a true
256 regression suite yet.
257
258 Graph and Body types now have more polymorphic variants Graph' and Body'.
259
260 Lots of experiments with zippers.
261
262 ### Changes ahead
263
264 ForwardTransfer will become an abstract type, and clients will have
265 two ways to create ForwardTransfers: as now, with a single,
266 polymorphic transfer function; or with a triple of monomorphic
267 transfer functions.  The implementation will use monomorphic
268 functions, which will enable more useful combinators on passes,
269 including adding more debugging information and enabling us to combine
270 passes.
271
272 Perhaps we should provide splicing and `addBlocks` on Graph?
273
274 Change of block representation to have three monomorphic unit
275 constructors and one polymorphic concatenation constructor.
276
277 Graph body to be represented by a finite map; add functions to check
278 for duplicate labels.
279
280 ## 3.7.12.1
281
282   - Added a bunch of zipper experiments.
283   - Existing clients should not be affected.
284
285 ## 3.7.12.0
286
287   - More expressive debugging support
288   - retract arfGraph and normalization; export analyzeAndRewriterFwd'
289
290 ## 3.7.11.1
291
292   - Expose arfGraph and normalization functions
293
294 ## 3.7.11.0
295
296   - Debugging support
297
298 ## 3.7.8.0
299
300   - Rationalized AGraph splicing functions.
301
302 ## 3.7.7.0
303
304   - Restrict clients so they see much less, including hiding
305     the value constructors for Body.