packages feed

hobbits 1.1 → 1.1.1

raw patch · 20 files changed

+222/−310 lines, 20 filesdep +transformersdep ~template-haskell

Dependencies added: transformers

Dependency ranges changed: template-haskell

Files

Data/Binding/Hobbits.hs view
@@ -32,6 +32,9 @@   -- matching on 'Data.Binding.Hobbits.Mb.Mb'   -- values. 'Data.Binding.Hobbits.QQ.superCombP' is similar. +  -- * Lifting values out of multi-bindings+  module Data.Binding.Hobbits.Liftable,+   -- * Ancilliary modules   module Data.Type.List,   -- | Type lists track the types of bound variables.@@ -45,4 +48,5 @@ import Data.Binding.Hobbits.Mb import Data.Binding.Hobbits.Closed import Data.Binding.Hobbits.QQ+import Data.Binding.Hobbits.Liftable import Data.Binding.Hobbits.NuElim
+ Data/Binding/Hobbits/Examples/UnitTests/NuElimTest.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE GADTs, RankNTypes, TypeOperators, ViewPatterns, TypeFamilies, FlexibleInstances, FlexibleContexts, TemplateHaskell, UndecidableInstances, ScopedTypeVariables, NoMonomorphismRestriction #-}++module NuElimTest where++import Data.Binding.Hobbits+++--+-- some helpers+--++proxies2 = Nil :> Proxy :> Proxy++nu2 :: (Name a1 -> Name a2 -> b) -> Mb (Nil :> a1 :> a2) b+nu2 f = nuMulti proxies2 $ \(Nil :> n1 :> n2) -> f n1 n2+++--+-- test that mbApply works correctly for names in the argument+--++test1f :: Mb (Nil :> a :> a) (Name a -> Int)+test1f = nu2 $ \n1 n2 n ->+         case () of+           () | Just Refl <- cmpName n n1 -> 1+           () | Just Refl <- cmpName n n2 -> 2+           _ -> 3++test1a = test1f `mbApply` (nu2 $ \n1 n2 -> n1) -- body should be 1+test1b = test1f `mbApply` (nu2 $ \n1 n2 -> n2) -- body should be 2+test1c = nu (\n -> test1f `mbApply` (nu2 $ \n1 n2 -> n)) -- body should be 3++++--+-- test that mbApply works correctly for names in the argument and the+-- return value+--++test2f :: Mb (Nil :> a :> a) (Name a -> Name a)+test2f = nu2 $ \n1 n2 n ->+         case () of+           () | Just Refl <- cmpName n n1 -> n2+           () | Just Refl <- cmpName n n2 -> n1+           _ -> n++test2a = test2f `mbApply` (nu2 $ \n1 n2 -> n1) -- should be Nu (n1,n2) n2+test2b = test2f `mbApply` (nu2 $ \n1 n2 -> n2) -- should be Nu (n1,n2) n1+test2c = nu (\n -> test2f `mbApply` (nu2 $ \n1 n2 -> n)) -- should be Nu (n) (Nu (n1,n2) n)
Data/Binding/Hobbits/Internal.hs view
@@ -111,3 +111,6 @@     writeIORef counter (x+1)     return x +fresh_names :: MapC Name ctx -> MapC Name ctx+fresh_names Nil = Nil+fresh_names (names :> n) = fresh_names names :> MkName (fresh_name n)
+ Data/Binding/Hobbits/Liftable.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE GADTs, TypeOperators, FlexibleInstances, OverlappingInstances, TemplateHaskell, ViewPatterns, QuasiQuotes #-}++-- |+-- Module      : Data.Binding.Hobbits.Mb+-- Copyright   : (c) 2014 Edwin Westbrook+--+-- License     : BSD3+--+-- Maintainer  : emw4@rice.edu+-- Stability   : experimental+-- Portability : GHC+--+-- This module defines the type-class Liftable for lifting+-- non-binding-related data out of name-bindings. Note that this code+-- is not "trusted", i.e., it is not part of the name-binding+-- abstraction: instead, it is all written using the primitives+-- exported by the Mb++module Data.Binding.Hobbits.Liftable where++import Data.Type.List.Proof.Member+import Data.Binding.Hobbits.Mb+import Data.Binding.Hobbits.QQ+++{-|+  The class @Liftable a@ gives a \"lifting function\" for a, which can+  take any data of type @a@ out of a multi-binding of type @'Mb' ctx a@.+-}+class Liftable a where+    mbLift :: Mb ctx a -> a++instance Liftable Int where+    mbLift = mbLiftInt++instance Liftable Integer where+    mbLift = mbLiftInteger++instance Liftable Char where+    mbLift = mbLiftChar++-- README: this requires overlapping instances, because it clashes+-- with Liftable2, but this instance is better because it does not+-- require c nor a to be liftable+instance Liftable (Member c a) where+    mbLift [nuP| Member_Base |] = Member_Base+    mbLift [nuP| Member_Step m |] = Member_Step (mbLift m)++{-|+  The class @Liftable1 f@ gives a lifting function for each type @f a@+  when @a@ itself is @Liftable@.+-}+class Liftable1 f where+    mbLift1 :: Liftable a => Mb ctx (f a) -> f a++instance (Liftable1 f, Liftable a) => Liftable (f a) where+    mbLift = mbLift1++instance Liftable1 [] where+    mbLift1 [nuP| [] |] = []+    mbLift1 [nuP| x : xs |] = (mbLift x) : (mbLift1 xs)++{-|+  The class @Liftable2 f@ gives a lifting function for each type @f a b@+  when @a@ and @b@ are @Liftable@.+-}+class Liftable2 f where+    mbLift2 :: (Liftable a, Liftable b) => Mb ctx (f a b) -> f a b++instance Liftable2 (,) where+    mbLift2 [nuP| (x,y) |] = (mbLift x, mbLift y)++instance (Liftable2 f, Liftable a) => Liftable1 (f a) where+    mbLift1 = mbLift2++-- | Lift a list (but not its elements) out of a multi-binding+mbList :: Mb c [a] -> [Mb c a]+mbList [nuP| [] |] = []+mbList [nuP| x : xs |] = x : mbList xs
Data/Binding/Hobbits/Mb.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE GADTs, TypeOperators, FlexibleInstances, OverlappingInstances #-}+{-# LANGUAGE GADTs, TypeOperators, FlexibleInstances #-}  -- | -- Module      : Data.Binding.Hobbits.Mb@@ -26,10 +26,8 @@   elimEmptyMb, mbCombine, mbSeparate, mbToProxy, --mbRearrange,   -- * Queries on names   cmpName, mbCmpName, mbNameBoundP,-  -- * type classes for lifting data out of bindings-  Liftable(..), Liftable1(..), Liftable2(..),-  -- * Optimized, safe multi-binding eliminators-  mbList,+  -- * Special-purpose functions for lifting primitives out of bindings+  mbLiftChar, mbLiftInt, mbLiftInteger,   -- * Synonyms   nus ) where@@ -41,7 +39,8 @@ import Data.Binding.Hobbits.Internal --import qualified Data.Binding.Hobbits.Internal as I ---import Data.List (elemIndex)+import Data.List (intersperse)+import Data.Functor.Constant  import Unsafe.Coerce (unsafeCoerce) @@ -56,11 +55,8 @@   showsPrec _ (MkName n) = showChar '#' . shows n . showChar '#'  instance Show (MapC Name c) where-    show mapc = "[" ++ (helper mapc) ++ "]"-        where-          helper :: MapC Name c -> String-          helper Nil = ""-          helper (ns :> n) = helper ns ++ ", " ++ show n+    show mapc = "[" ++ (concat $ intersperse "," $ mapCToList $+                        mapC (Constant . show) mapc) ++ "]"  -- note: we reverse l to show the inner-most bindings last instance Show a => Show (Mb c a) where@@ -190,53 +186,17 @@   (Right n1, Right n2) -> cmpName n1 n2   _ -> Nothing -{-|-  The class @Liftable a@ gives a \"lifting function\" for a, which can-  take any data of type @a@ out of a multi-binding of type @'Mb' ctx a@.--}-class Liftable a where-    mbLift :: Mb ctx a -> a--instance Liftable Int where-    mbLift (MkMb _ i) = i--instance Liftable Char where-    mbLift (MkMb _ c) = c--instance Liftable (Member c a) where-    mbLift (MkMb _ mem) = mem--{-|-  The class @Liftable1 f@ gives a lifting function for each type @f a@-  when @a@ itself is @Liftable@.--}-class Liftable1 f where-    mbLift1 :: Liftable a => Mb ctx (f a) -> f a--instance (Liftable1 f, Liftable a) => Liftable (f a) where-    mbLift = mbLift1--instance Liftable1 [] where-    mbLift1 (MkMb _ []) = []-    mbLift1 (MkMb names (x : xs)) =-        (mbLift (MkMb names x)) : (mbLift1 (MkMb names xs))--{-|-  The class @Liftable2 f@ gives a lifting function for each type @f a b@-  when @a@ and @b@ are @Liftable@.--}-class Liftable2 f where-    mbLift2 :: (Liftable a, Liftable b) => Mb ctx (f a b) -> f a b--instance (Liftable2 f, Liftable a) => Liftable1 (f a) where-    mbLift1 = mbLift2---- | Lift a list (but not its elements) out of a multi-binding-mbList :: Mb c [a] -> [Mb c a]-mbList (MkMb names []) = []-mbList (MkMb names (x : xs)) = (MkMb names x) : (mbList (MkMb names xs))+-- | Lifts a @Char@ out of a multi-binding+mbLiftChar :: Mb c Char -> Char+mbLiftChar (MkMb _ c) = c +-- | Lifts an @Int@ out of a multi-binding+mbLiftInt :: Mb c Int -> Int+mbLiftInt (MkMb _ c) = c +-- | Lifts an @Integer@ out of a multi-binding+mbLiftInteger :: Mb c Integer -> Integer+mbLiftInteger (MkMb _ c) = c  -- | @nus = nuMulti@ nus x = nuMulti x
− Data/Binding/Hobbits/Mb.hs-darcs-backup0
@@ -1,235 +0,0 @@-{-# LANGUAGE GADTs, TypeOperators, FlexibleInstances, OverlappingInstances #-}---- |--- Module      : Data.Binding.Hobbits.Mb--- Copyright   : (c) 2011 Edwin Westbrook, Nicolas Frisby, and Paul Brauner------ License     : BSD3------ Maintainer  : emw4@rice.edu--- Stability   : experimental--- Portability : GHC------ This module defines multi-bindings as the type 'Mb', as well as a number of--- operations on multi-bindings. See the paper E. Westbrook, N. Frisby,--- P. Brauner, \"Hobbits for Haskell: A Library for Higher-Order Encodings in--- Functional Programming Languages\" for more information.--module Data.Binding.Hobbits.Mb (-  -- * Abstract types-  Name(),      -- hides Name implementation-  Binding(),   -- hides Binding implementation-  Mb(),        -- hides MultiBind implementation-  -- * Multi-binding constructors-  nu, emptyMb, nuMulti,-  -- * Operations on multi-bindings-  elimEmptyMb, combineMb, mbSeparate, mbToProxy, mbRearrange,-  -- * Queries on names-  cmpName, mbCmpName, mbNameBoundP,-  -- * type classes for lifting data out of bindings-  Liftable(..), Liftable1(..), Liftable2(..),-  -- * Optimized, safe multi-binding eliminators-  mbList-) where--import Data.Type.List-import Data.Type.List.Map-import qualified Data.Type.List.Proof.Member as Mem---import qualified Data.Type.List.Proof.Append as App-import Data.Binding.Hobbits.Internal---import qualified Data.Binding.Hobbits.Internal as I----import Data.List (elemIndex)--import Unsafe.Coerce (unsafeCoerce)------------------------------------------------------------------------------------ bindings------------------------------------------------------------------------------------ | A @Binding@ is simply a multi-binding that binds one name-type Binding a = Mb (Nil :> a)--instance Show (Name a) where-  showsPrec _ (MkName n) = showChar '#' . shows n . showChar '#'--instance Show (MapC Name c) where-    show mapc = "[" ++ (helper mapc) ++ "]"-        where-          helper :: MapC Name c -> String-          helper Nil = ""-          helper (ns :> n) = helper ns ++ ", " ++ show n---- note: we reverse l to show the inner-most bindings last-instance Show a => Show (Mb c a) where-  showsPrec p (MkMb names b) = showParen (p > 10) $-    showChar '#' . shows names . showChar '.' . shows b---- README: we pass f to fresh_name to avoid let-floating the results--- of fresh_name (which would always give the same name for each nu)--- README: is *is* ok to do CSE on multiple copies of nu, because--- the programmer cannot tell if two distinct (non-nested) nus get the--- same fresh integer, and two nus that look the same to the CSE engine--- cannot be nested--- README: it *is* ok to inline nu because we don't care in--- what order fresh names are created-{-|-  @nu f@ creates a binding which binds a fresh name @n@ and whose-  body is the result of @f n@.--}-nu :: (Name a -> b) -> Binding a b-nu f = let n = fresh_name f in n `seq` MkMb (Nil :> MkName n) (f (MkName n))---- README: inner-most bindings come FIRST--- | Combines a binding inside another binding into a single binding.-combineMb :: Mb c1 (Mb c2 b) -> Mb (c1 :++: c2) b-combineMb (MkMb l1 (MkMb l2 b)) = MkMb (append l1 l2) b--{-|-  Separates a binding into two nested bindings. The first argument, of-  type @'Append' c1 c2 c@, is a \"phantom\" argument to indicate how-  the context @c@ should be split.--}-separateMb :: Append c1 c2 c -> Mb c a -> Mb c1 (Mb c2 a)-separateMb app (MkMb l a) = MkMb d (MkMb t a) where-  (d, t) = split app l---- | Returns a proxy object that enumerates all the types in ctx.-mbToProxy :: Mb ctx a -> MapC Proxy ctx-mbToProxy (MkMb l _) = mapC (\_ -> Proxy) l--{- README: this is unsafe, because the two bindings could share names-{- |-  Take a multi-binding inside another multi-binding and move the-  outer binding inside the ineer one.--}-mbRearrange :: Mb ctx1 (Mb ctx2 a) -> Mb ctx2 (Mb ctx1 a)-mbRearrange (MkMb l1 (MkMb l2 a)) = MkMb l2 (MkMb l1 a)--}---- | Creates an empty binding that binds 0 names.-emptyMb :: a -> Mb Nil a-emptyMb t = MkMb Nil t--{-|-  The expression @nuMulti p f@ creates a multi-binding of zero or more-  names, one for each element of the vector @p@. The bound names are-  passed the names to @f@, which returns the body of the-  multi-binding.  The argument @p@, of type @'Mb' f ctx@, acts as a-  \"phantom\" argument, used to reify the list of types @ctx@ at the-  term level; thus it is unimportant what the type function @f@ is.--}-nuMulti :: MapC f ctx -> (MapC Name ctx -> b) -> Mb ctx b-nuMulti Nil f = emptyMb $ f Nil-nuMulti (proxies :> proxy) f =-    combineMb $ nuMulti proxies $ \names -> nu $ \n -> f (names :> n)--{-|-  Eliminates an empty binding, returning its body. Note that-  @elimEmptyMb@ is the inverse of @emptyMb@.--}-elimEmptyMb :: Mb Nil a -> a-elimEmptyMb (MkMb Nil t) = t---elimEmptyMb _ = error "Should not happen! (elimEmptyMb)"--{-|-  @cmpName n m@ compares names @n@ and @m@ of types @Name a@ and @Name b@,-  respectively. When they are equal, @Some e@ is returned for @e@ a proof-  of type @a :=: b@ that their types are equal. Otherwise, @None@ is returned.--  For example:--> nu $ \n -> nu $ \m -> cmpName n n   ==   nu $ \n -> nu $ \m -> Some Refl-> nu $ \n -> nu $ \m -> cmpName n m   ==   nu $ \n -> nu $ \m -> None--}-cmpName :: Name a -> Name b -> Maybe (a :=: b)-cmpName (MkName n1) (MkName n2)-  | n1 == n2 = Just $ unsafeCoerce Refl-  | otherwise = Nothing--{-|-  Checks if a name is bound in a multi-binding, returning @Left mem@-  when the name is bound, where @mem@ is a proof that the type of the-  name is in the type list for the multi-binding, and returning-  @Right n@ when the name is not bound, where @n@ is the name.--  For example:--> nu $ \n -> mbNameBoundP (nu $ \m -> m)  ==  nu $ \n -> Left Member_Base-> nu $ \n -> mbNameBoundP (nu $ \m -> n)  ==  nu $ \n -> Right n--}-mbNameBoundP :: Mb ctx (Name a) -> Either (Member ctx a) (Name a)-mbNameBoundP (MkMb names n) = helper names n where-    helper :: MapC Name c -> Name a -> Either (Member c a) (Name a)-    helper Nil n = Right n-    helper (names :> (MkName i)) (MkName j) | i == j = unsafeCoerce $ Left Member_Base-    helper (names :> _) n = case helper names n of-                              Left memb -> Left (Member_Step memb)-                              Right n -> Right n--- old implementation with lists-{--case elemIndex n names of-  Nothing -> Right (MkName n)-  Just i -> Left (I.unsafeLookupC i)--}---{-|-  Compares two names inside bindings, taking alpha-equivalence into-  account; i.e., if both are the @i@th name, or both are the same name-  not bound in their respective multi-bindings, then they compare as-  equal. The return values are the same as for 'cmpName', so that-  @Some Refl@ is returned when the names are equal and @Nothing@ is-  returned when they are not.--}-mbCmpName :: Mb c (Name a) -> Mb c (Name b) -> Maybe (a :=: b)-mbCmpName b1 b2 = case (mbNameBoundP b1, mbNameBoundP b2) of-  (Left mem1, Left mem2) -> Mem.same mem1 mem2-  (Right n1, Right n2) -> cmpName n1 n2-  _ -> Nothing--{-|-  The class @Liftable a@ gives a \"lifting function\" for a, which can-  take any data of type @a@ out of a multi-binding of type @'Mb' ctx a@.--}-class Liftable a where-    mbLift :: Mb ctx a -> a--instance Liftable Int where-    mbLift (MkMb _ i) = i--instance Liftable Char where-    mbLift (MkMb _ c) = c--instance Liftable (Member c a) where-    mbLift (MkMb _ mem) = mem--{-|-  The class @Liftable1 f@ gives a lifting function for each type @f a@-  when @a@ itself is @Liftable@.--}-class Liftable1 f where-    mbLift1 :: Liftable a => Mb ctx (f a) -> f a--instance (Liftable1 f, Liftable a) => Liftable (f a) where-    mbLift = mbLift1--instance Liftable1 [] where-    mbLift1 (MkMb _ []) = []-    mbLift1 (MkMb names (x : xs)) =-        (mbLift (MkMb names x)) : (mbLift1 (MkMb names xs))--{-|-  The class @Liftable2 f@ gives a lifting function for each type @f a b@-  when @a@ and @b@ are @Liftable@.--}-class Liftable2 f where-    mbLift2 :: (Liftable a, Liftable b) => Mb ctx (f a b) -> f a b--instance (Liftable2 f, Liftable a) => Liftable1 (f a) where-    mbLift1 = mbLift2---- | Lift a list (but not its elements) out of a multi-binding-mbList :: Mb c [a] -> [Mb c a]-mbList (MkMb names []) = []-mbList (MkMb names (x : xs)) = (MkMb names x) : (mbList (MkMb names xs))
Data/Binding/Hobbits/NuElim.hs view
@@ -49,11 +49,8 @@       Nothing -> mapNamesPf NuElimName names names' n mapNamesPf NuElimName _ _ _ = error "Should not be possible! (in mapNamesPf)" mapNamesPf (NuElimMb nuElim) names1 names2 (MkMb ns b) =-    undefined-{- FIXME: something like this...     let names2' = fresh_names ns in-    MkMb names2' $ mapNamesPf (names1 |++> ns) (names2 |++> names2') b--}+    MkMb names2' $ mapNamesPf nuElim (names1 `append` ns) (names2 `append` names2') b mapNamesPf (NuElimFun nuElimIn nuElimOut) names names' f =     (mapNamesPf nuElimOut names names') . f . (mapNamesPf nuElimIn names' names) mapNamesPf (NuElimData (NuElimDataProof mapFun)) names names' x =@@ -189,11 +186,8 @@ -} mbApply :: (NuElim a, NuElim b) => Mb ctx (a -> b) -> Mb ctx a -> Mb ctx b mbApply (MkMb names f) (MkMb names' a) =-    let names'' = fresh_names names in -- FIXME HERE-    MkMb names $ (mapNames names names'' f) (mapNames names' names'' a) where-        fresh_names :: MapC Name ctx -> MapC Name ctx-        fresh_names Nil = Nil-        fresh_names (names :> n) = fresh_names names :> MkName (fresh_name n)+    let names'' = fresh_names names in+    MkMb names'' $ (mapNames names names'' f) (mapNames names' names'' a)  mbMapAndSwap :: NuElim a => (Mb ctx1 a -> b) -> Mb ctx1 (Mb ctx2 a) -> Mb ctx2 b mbMapAndSwap = undefined@@ -205,6 +199,8 @@ {-|   Take a multi-binding inside another multi-binding and move the   outer binding inside the inner one.++  NOTE: This is not yet implemented. -} mbRearrange :: NuElim a => Mb ctx1 (Mb ctx2 a) -> Mb ctx2 (Mb ctx1 a) mbRearrange = mbMapAndSwap id
Data/Binding/Hobbits/PatternParser.hs view
@@ -17,17 +17,26 @@ import qualified Language.Haskell.Exts.Parser as Meta  import qualified Language.Haskell.Meta.Parse as Meta-import Language.Haskell.Exts.Extension (Extension(ViewPatterns))+ import qualified Language.Haskell.Meta.Parse as Sloppy import qualified Language.Haskell.Meta.Syntax.Translate as Translate +import Language.Haskell.Exts.Extension +#if MIN_VERSION_haskell_src_exts(1,14,0)+parsePatternExtensions =+  map EnableExtension $ ViewPatterns : Sloppy.myDefaultExtensions+#else+parsePatternExtensions = ViewPatterns : Sloppy.myDefaultExtensions+#endif   ++ parsePattern :: String -> String -> Either String Pat parsePattern fn =   fmap Translate.toPat . Meta.parseResultToEither .   Meta.parsePatWithMode (Sloppy.myDefaultParseMode                     {Meta.parseFilename = fn,-                     Meta.extensions = ViewPatterns : Sloppy.myDefaultExtensions})+                     Meta.extensions = parsePatternExtensions })
− Data/Type/HList.hi

binary file changed (1372 → absent bytes)

− Data/Type/HList.o

binary file changed (936 → absent bytes)

− Data/Type/List/HList.hi

binary file changed (1247 → absent bytes)

− Data/Type/List/HList.o

binary file changed (936 → absent bytes)

Data/Type/List/Map.hs view
@@ -20,6 +20,8 @@ import Data.Proxy (Proxy(..)) --import Data.Typeable +import Data.Functor.Constant+ ------------------------------------------------------------------------------- -- a vector of functor values, indexed by an List -------------------------------------------------------------------------------@@ -92,3 +94,8 @@ replace :: MapC f c -> Member c a -> f a -> MapC f c replace (xs :> _) Member_Base y = xs :> y replace (xs :> x) (Member_Step memb) y = replace xs memb y :> x++-- | Convert a MapC to a list+mapCToList :: MapC (Constant a) c -> [a]+mapCToList Nil = []+mapCToList (xs :> Constant x) = mapCToList xs ++ [x]
− Data/Type/List/Proof/Append.hi

binary file changed (1389 → absent bytes)

− Data/Type/List/Proof/Append.o

binary file changed (4024 → absent bytes)

− Data/Type/List/Proof/Member.hi

binary file changed (2392 → absent bytes)

− Data/Type/List/Proof/Member.o

binary file changed (10976 → absent bytes)

LICENSE view
@@ -1,10 +1,27 @@-HobbitLib is Copyright (c) Edwin Westbrook, Nicolas Frisby, Paul Brauner, 2011.+Copyright (c) 2014, Eddy Westbrook, Nicolas Frisby, Paul Brauner All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:+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 of source code must retain the above copyright notice, this+  list of conditions and the following disclaimer. -- Neither name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.+* 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. -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.+* Neither the name of the {organization} nor the names of its+  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 HOLDER 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.
hobbits.cabal view
@@ -1,5 +1,5 @@ Name:                hobbits-Version:             1.1+Version:             1.1.1 Synopsis:            A library for canonically representing terms with binding  Description: A library for canonically representing terms with binding via a@@ -18,7 +18,7 @@  Library   Build-Depends: base >= 4 && < 5-  Build-Depends: template-haskell >= 2.5 && < 2.8+  Build-Depends: template-haskell >= 2.5 && < 2.9    Build-Depends: syb   Build-Depends: mtl@@ -27,10 +27,12 @@   Build-Depends: deepseq    Build-Depends: haskell-src-meta >= 0.5.1.1, haskell-src-exts,-                 th-expand-syns >= 0.3 && < 0.4+                 th-expand-syns >= 0.3 && < 0.4, transformers    GHC-Options: -fwarn-incomplete-patterns -fwarn-unused-imports +  Extensions: CPP+   Exposed-Modules: Data.Type.List,                    Data.Type.List.List,                    Data.Type.List.Map,@@ -41,6 +43,7 @@                    Data.Binding.Hobbits.Mb,                    Data.Binding.Hobbits.Closed,                    Data.Binding.Hobbits.QQ,+                   Data.Binding.Hobbits.Liftable,                     Data.Binding.Hobbits.Internal,                    Data.Binding.Hobbits.PatternParser,
+ output view
@@ -0,0 +1,20 @@+Glasgow Haskell Compiler, Version 7.6.3, stage 2 booted by GHC version 7.4.2+Using binary package database: /Library/Frameworks/GHC.framework/Versions/7.6.3-x86_64/usr/lib/ghc-7.6.3/package.conf.d/package.cache+Using binary package database: /Users/eddy/.ghc/x86_64-darwin-7.6.3/package.conf.d/package.cache+hiding package Cabal-1.16.0 to avoid conflict with later version Cabal-1.18.1.2+wired-in package ghc-prim mapped to ghc-prim-0.3.0.0-d5221a8c8a269b66ab9a07bdc23317dd+wired-in package integer-gmp mapped to integer-gmp-0.5.0.0-2f15426f5b53fe4c6490832f9b20d8d7+wired-in package base mapped to base-4.6.0.1-6c351d70a24d3e96f315cba68f3acf57+wired-in package rts mapped to builtin_rts+wired-in package template-haskell mapped to template-haskell-2.8.0.0-c2c1b21dbbb37ace4b7dc26c966ec664+wired-in package dph-seq not found.+wired-in package dph-par not found.+Hsc static flags: -static+Created temporary directory: /var/folders/st/cjmsx__d5f17m4_1qn0dxkpr0000gn/T/ghc36361_0+*** C pre-processor:+'/usr/bin/clang-wrapper' '-E' '-undef' '-traditional' '-m64' '-fno-stack-protector' '-m64' '-I' '/Library/Frameworks/GHC.framework/Versions/7.6.3-x86_64/usr/lib/ghc-7.6.3/base-4.6.0.1/include' '-I' '/Library/Frameworks/GHC.framework/Versions/7.6.3-x86_64/usr/lib/ghc-7.6.3/include' '-D__GLASGOW_HASKELL__=706' '-Ddarwin_BUILD_OS=1' '-Dx86_64_BUILD_ARCH=1' '-Ddarwin_HOST_OS=1' '-Dx86_64_HOST_ARCH=1' '-U __PIC__' '-D__PIC__' '-include' 'dist/build/autogen/cabal_macros.h' '-D__GLASGOW_HASKELL__=706' '-Ddarwin_BUILD_OS=1' '-Dx86_64_BUILD_ARCH=1' '-Ddarwin_HOST_OS=1' '-Dx86_64_HOST_ARCH=1' '-x' 'c' 'Data/Type/List.hs' '-o' '/var/folders/st/cjmsx__d5f17m4_1qn0dxkpr0000gn/T/ghc36361_0/ghc36361_0.hscpp'+*** Copying `/var/folders/st/cjmsx__d5f17m4_1qn0dxkpr0000gn/T/ghc36361_0/ghc36361_0.hscpp' to `dist/build/tmp-36333/Data/Type/List.hs':+*** Deleting temp files:+Deleting: /var/folders/st/cjmsx__d5f17m4_1qn0dxkpr0000gn/T/ghc36361_0/ghc36361_0.hscpp+*** Deleting temp dirs:+Deleting: /var/folders/st/cjmsx__d5f17m4_1qn0dxkpr0000gn/T/ghc36361_0