{-# LANGUAGE CPP, GADTs #-} #if __GLASGOW_HASKELL__ >= 701 {-# LANGUAGE Safe #-} #endif module Compiler.Hoopl.Shape {-# DEPRECATED "not ready to migrate to this yet" #-} where -- | Used at the type level to indicate an "open" structure with -- a unique, unnamed control-flow edge flowing in or out. -- "Fallthrough" and concatenation are permitted at an open point. data O -- | Used at the type level to indicate a "closed" structure which -- supports control transfer only through the use of named -- labels---no "fallthrough" is permitted. The number of control-flow -- edges is unconstrained. data C data HalfShape s where ShapeO :: HalfShape O ShapeC :: HalfShape C data Shape e x where ShapeOO :: Shape O O ShapeCO :: Shape C O ShapeOC :: Shape O C ShapeCC :: Shape C C class Shapely n where shape :: n e x -> Shape e x shapeAtEntry :: n e x -> HalfShape e shapeAtExit :: n e x -> HalfShape x shapeAtEntry = entryHalfShape . shape shapeAtExit = exitHalfShape . shape entryHalfShape :: Shape e x -> HalfShape e exitHalfShape :: Shape e x -> HalfShape x entryHalfShape ShapeOO = ShapeO entryHalfShape ShapeOC = ShapeO entryHalfShape ShapeCO = ShapeC entryHalfShape ShapeCC = ShapeC exitHalfShape ShapeOO = ShapeO exitHalfShape ShapeOC = ShapeC exitHalfShape ShapeCO = ShapeO exitHalfShape ShapeCC = ShapeC