Permalink
Browse files

Initial commit

  • Loading branch information...
0 parents commit 4f8dce82f91fb5ca9d577eb449772b23fc86a781 @ahammar committed Apr 25, 2011
Showing with 115 additions and 0 deletions.
  1. +1 −0 .gitignore
  2. +30 −0 LICENSE
  3. +2 −0 Setup.hs
  4. +26 −0 placeholders.cabal
  5. +56 −0 src/Development/Placeholders.hs
@@ -0,0 +1 @@
+dist
30 LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2011, Andreas Hammar
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of Andreas Hammar nor the names of other
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
@@ -0,0 +1,26 @@
+Name: placeholders
+Version: 0.1
+Synopsis: Placeholders for use under development
+Description: TODO: Add a description
+Homepage: http://github.com/ahammar/placeholders
+License: BSD3
+License-file: LICENSE
+Author: Andreas Hammar
+Maintainer: Andreas Hammar <ahammar@gmail.com>
+Copyright: (c) 2011 Andreas Hammar
+Category: Development
+Build-type: Simple
+Cabal-version: >=1.6
+
+Source-repository head
+ Type: git
+ Location: git://github.com/ahammar/placeholders.git
+
+Library
+ Exposed-modules: Development.Placeholders
+
+ Build-depends: base >= 4 && < 5,
+ template-haskell
+
+ Hs-source-dirs: src
+
@@ -0,0 +1,56 @@
+{-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-}
+
+module Development.Placeholders (
+ PlaceholderException(..),
+ placeholder,
+ placeholderNoWarning,
+ notImplemented,
+ todo
+) where
+
+import Control.Exception (Exception, throw)
+import Data.Typeable (Typeable)
+import Language.Haskell.TH (Q, Exp, Loc(..), litE, stringL, location, report)
+
+-- | Thrown when attempting to evaluate a placeholder at runtime.
+data PlaceholderException = PlaceholderException String
+ deriving (Show, Typeable)
+
+instance Exception PlaceholderException
+
+-- | Shorthand for @placeholder "Unimplemented feature"@
+notImplemented :: Q Exp
+notImplemented = placeholder "Unimplemented feature"
+
+-- | Shorthand for @placeholder ("TODO: " ++ msg)@
+todo :: String -> Q Exp
+todo msg = placeholder $ "TODO: " ++ msg
+
+-- | Generates an expression of any type that, if evaluated at runtime will throw
+-- a 'PlaceholderException'. It is therefore similar to 'undefined' or 'error',
+-- except that this clearly communicates that this is temporary, and the source
+-- location is automatically included. Also, a warning is generated at compile time
+-- so you won't forget to replace placeholders before shipping.
+placeholder :: String -> Q Exp
+placeholder msg = do
+ emitWarning msg
+ placeholderNoWarning msg
+
+-- | Similar to 'placeholder', but does not generate a compiler warning. Use
+-- with care!
+placeholderNoWarning :: String -> Q Exp
+placeholderNoWarning msg = do
+ runtimeMsg <- formatMessage msg `fmap` location
+ [| throw $ PlaceholderException $(litE $ stringL runtimeMsg) |]
+
+emitWarning :: String -> Q ()
+emitWarning msg = report False $ msg
+
+formatMessage :: String -> Loc -> String
+formatMessage msg loc = msg ++ " at " ++ formatLoc loc
+
+formatLoc :: Loc -> String
+formatLoc loc = let file = loc_filename loc
+ (line, col) = loc_start loc
+ in concat [file, ":", show line, ":", show col]
+

0 comments on commit 4f8dce8

Please sign in to comment.