    -- Reporting bugs in darcs.  See also impossible.h.
    module Darcs.Bug ( _bug, _bugDoc, _impossible, _fromJust
                     ) where

    import Printer ( Doc, errorDoc, text, ($$) )

    type BugStuff = (String, Int, String, String)

    _bug :: BugStuff -> String -> a
    _bug bs s = _bugDoc bs (text s)

    _bugDoc :: BugStuff -> Doc -> a
    _bugDoc bs s = errorDoc $
       text ("bug at " ++ _bugLoc bs) $$ s $$
       text ("See http://wiki.darcs.net/BugTracker/Reporting " ++
             "for help on bug reporting.")

    _bugLoc :: BugStuff -> String
    _bugLoc (file, line, date, time) = file++":"++show line++" compiled "++time++" "++date

    _impossible :: BugStuff -> a
    _impossible bs = _bug bs $ "Impossible case at "++_bugLoc bs

    _fromJust :: BugStuff -> Maybe a -> a
    _fromJust bs mx =
      case mx of Nothing -> _bug bs $ "fromJust error at "++_bugLoc bs
                 Just x  -> x