statically checked non-empty layout lists
The new layout code introduces more chances for runtime errors than I'd like. In particular, the Dynamic type, and the possibility of users defining empty layout lists. Here's a cute approach, purely for instructive purposes, on statically checked non empty layout lists for Config.hs: Given a GADT for non-empty lists: data Empty data NonEmpty data List x y where Nil :: List Empty x Cons :: x -> List y x -> List NonEmpty x toList :: List t a -> [a] toList Nil = [] toList (Cons x y) = x : toList y infixr 5 .:. (.:.) :: x -> List t x -> List NonEmpty x (.:.) = Cons We can constrain: defaultLayouts :: List NonEmpty Layout meaning that this becomes a statically checked error: defaultLayouts = Nil resulting in: Config.hs:138:17: Couldn't match expected type `NonEmpty' against inferred type `Empty' Expected type: List NonEmpty Layout Inferred type: List Empty Layout While this is fine: defaultLayouts :: List NonEmpty Layout defaultLayouts = full .:. tall defaultDelta (1%2) .:. Nil Cute huh? -- Don
dons:
The new layout code introduces more chances for runtime errors than I'd like. In particular, the Dynamic type, and the possibility of users defining empty layout lists.
And a patch, just so its archived somewhere. New patches: [Use a GADT for non-empty list checking Don Stewart <dons@cse.unsw.edu.au>**20070504041020] { hunk ./Config.hs 137 -defaultLayouts :: [Layout] -defaultLayouts = [ full, tall defaultDelta (1%2), wide defaultDelta (1%2) ] +defaultLayouts :: List NonEmpty Layout +defaultLayouts = full .:. tall defaultDelta (1%2) .:. wide defaultDelta (1%2) .:. Nil hunk ./Config.hs-boot 2 -import XMonad (Layout) +import XMonad (Layout,List,NonEmpty) hunk ./Config.hs-boot 4 -defaultLayouts :: [Layout] +defaultLayouts :: List NonEmpty Layout hunk ./Main.hs 58 - , focusedBorder = fbc - } + , focusedBorder = fbc } hunk ./Main.hs 61 - , layouts = M.empty - } + , layouts = M.empty } hunk ./Operations.hs 51 + hunk ./Operations.hs 53 + hunk ./Operations.hs 148 - fl = M.findWithDefault defaultLayouts n $ layouts s + fl = M.findWithDefault (toList defaultLayouts) n $ layouts s hunk ./XMonad.hs 20 - runX, io, withDisplay, isRoot, spawn, trace, whenJust + runX, io, withDisplay, isRoot, spawn, trace, whenJust, + toList, List(..), NonEmpty, (.:.) hunk ./XMonad.hs 103 +data Empty +data NonEmpty + +data List x y where + Nil :: List Empty x + Cons :: x -> List y x -> List NonEmpty x + +toList :: List t a -> [a] +toList Nil = [] +toList (Cons x y) = x : toList y + +infixr 5 .:. +(.:.) :: x -> List t x -> List NonEmpty x +(.:.) = Cons + } Context: [refactoring, style, comments on new layout code Don Stewart <dons@cse.unsw.edu.au>**20070504023618] [use anyKey constant instead of magic number Jason Creighton <jcreigh@gmail.com>**20070504015043] [added mirrorLayout to mirror arbitrary layouts Jason Creighton <jcreigh@gmail.com>**20070504014653] [Fix layout switching order Spencer Janssen <sjanssen@cse.unl.edu>**20070503235632] [More Config.hs bugs Spencer Janssen <sjanssen@cse.unl.edu>**20070503234607] [Revert accidental change to Config.hs Spencer Janssen <sjanssen@cse.unl.edu>**20070503233148] [Add -fglasgow-exts for pattern guards. Properties.hs doesn't complain anymore Spencer Janssen <sjanssen@cse.unl.edu>**20070503214221] [Avoid the unsafe pattern match, in case Config.hs has no layouts Spencer Janssen <sjanssen@cse.unl.edu>**20070503214007] [add support for extensible layouts. David Roundy <droundy@darcs.net>**20070503144750] [comments. and stop tracing events to stderr Don Stewart <dons@cse.unsw.edu.au>**20070503075821] [-Wall police Don Stewart <dons@cse.unsw.edu.au>**20070503074937] [elaborate documentation in Config.hs Don Stewart <dons@cse.unsw.edu.au>**20070503074843] [Use updated refreshKeyboardMapping. Requires latest X11-extras Spencer Janssen <sjanssen@cse.unl.edu>**20070503032040] [run QC tests in addition to LOC test Jason Creighton <jcreigh@gmail.com>**20070503003202] [Add 'mod-n': refreshes current layout Spencer Janssen <sjanssen@cse.unl.edu>**20070503002252] [Fix tests after StackSet changes Spencer Janssen <sjanssen@cse.unl.edu>**20070502201622] [First steps to adding floating layer Spencer Janssen <sjanssen@cse.unl.edu>**20070502195917] [update motivational text using xmonad.org Don Stewart <dons@cse.unsw.edu.au>**20070502061859] [Sort dependencies in installation order Spencer Janssen <sjanssen@cse.unl.edu>**20070501204249] [Recommend X11-extras 0.1 Spencer Janssen <sjanssen@cse.unl.edu>**20070501204121] [elaborate description in .cabal Don Stewart <dons@cse.unsw.edu.au>**20070501035414] [use -fasm by default. Much faster Don Stewart <dons@cse.unsw.edu.au>**20070501031220] [Make border width configurable Spencer Janssen <sjanssen@cse.unl.edu>**20070430163515] [Add Config.hs-boot, remove defaultLayoutDesc from XConf Spencer Janssen <sjanssen@cse.unl.edu>**20070430162647] [Comment only Spencer Janssen <sjanssen@cse.unl.edu>**20070430161635] [Comment only Spencer Janssen <sjanssen@cse.unl.edu>**20070430161511] [check we never generate invalid stack sets Don Stewart <dons@cse.unsw.edu.au>**20070430065946] [view n . shift n . view i . shift i) x == x --> shift + view is invertible Don Stewart <dons@cse.unsw.edu.au>**20070430062901] [add rotate all and view idempotency tests Don Stewart <dons@cse.unsw.edu.au>**20070430055751] [Add XConf for values that don't change. Spencer Janssen <sjanssen@cse.unl.edu>**20070430054715] [Control.Arrow is suspicious, add an explicit import Spencer Janssen <sjanssen@cse.unl.edu>**20070430053623] [push is idempotent Don Stewart <dons@cse.unsw.edu.au>**20070430054345] [add two properties relating to empty window managers Don Stewart <dons@cse.unsw.edu.au>**20070430051016] [configurable border colors Jason Creighton <jcreigh@gmail.com>**20070430043859 This also fixes a bug where xmonad was assuming a 24-bit display, and just using, eg, 0xff0000 as an index into a colormap without querying the X server to determine the proper pixel value for "red". ] [new QC property: opening a window only affects the current screen Don Stewart <dons@cse.unsw.edu.au>**20070430050133] [a bit more precise about building non-empty stacksets for one test Don Stewart <dons@cse.unsw.edu.au>**20070430035729] [remove redundant call to 'delete' in 'shift' Don Stewart <dons@cse.unsw.edu.au>**20070430031151] [clean 'delete' a little Don Stewart <dons@cse.unsw.edu.au>**20070430025319] [shrink 'swap' Don Stewart <dons@cse.unsw.edu.au>**20070430024813] [shrink 'rotate' a little Don Stewart <dons@cse.unsw.edu.au>**20070430024525] [move size into Properties.hs Don Stewart <dons@cse.unsw.edu.au>**20070430021758] [don't need 'size' operation on StackSet Don Stewart <dons@cse.unsw.edu.au>**20070430015927] [avoid grabbing all keys when a keysym is undefined Jason Creighton <jcreigh@gmail.com>**20070428180046 XKeysymToKeycode() returns zero if the keysym is undefined. Zero also happens to be the value of AnyKey. ] [add homepage: field to .cabal file Don Stewart <dons@cse.unsw.edu.au>**20070429041011] [add fromList to Properties.hs Don Stewart <dons@cse.unsw.edu.au>**20070429035823] [move fromList into Properties.hs, -17 loc Don Stewart <dons@cse.unsw.edu.au>**20070429035804] [Further refactoring Spencer Janssen <sjanssen@cse.unl.edu>**20070426212257] [Refactor in Config.hs (no real changes) Spencer Janssen <sjanssen@cse.unl.edu>**20070426211407] [Add the manpage to extra-source-files Spencer Janssen <sjanssen@cse.unl.edu>**20070426014105] [add xmonad manpage David Lazar <davidlazar@styso.com>**20070426010812] [Remove toList Spencer Janssen <sjanssen@cse.unl.edu>**20070426005713] [Ignore numlock and capslock in keybindings Jason Creighton <jcreigh@gmail.com>**20070424013357] [Clear numlock bit Spencer Janssen <sjanssen@cse.unl.edu>**20070424010352] [force window border to 1px Jason Creighton <jcreigh@gmail.com>**20070423050824] [s/creigh// Don Stewart <dons@cse.unsw.edu.au>**20070423024026] [some other things to do Don Stewart <dons@cse.unsw.edu.au>**20070423023151] [Start TODOs for 0.2 Spencer Janssen <sjanssen@cse.unl.edu>**20070423021526] [update readme Don Stewart <dons@cse.unsw.edu.au>**20070422090507] [TAG 0.1 Spencer Janssen <sjanssen@cse.unl.edu>**20070422083033] Patch bundle hash: 5e766922308da95a360e50a2a978e76215434b6e
On Fri, May 04, 2007 at 02:16:35PM +1000, Donald Bruce Stewart wrote:
dons:
The new layout code introduces more chances for runtime errors than I'd like. In particular, the Dynamic type, and the possibility of users defining empty layout lists.
And a patch, just so its archived somewhere.
I'd vote yes on this. Only I'd prefer an infix constructor for Cons, such as :.: or something, so pattern matching will be prettier. -- David Roundy http://www.darcs.net
participants (2)
-
David Roundy -
dons@cse.unsw.edu.au