From ce9526912145f8cf853877bda6fea86b6417fa01 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Fri, 12 Sep 2008 02:53:14 +0000 Subject: [PATCH] ext-core library: Fix performance bug isUtupleTy was implemented inefficiently (and is called a lot by the typechecker). Replaced with uglier but faster code. --- utils/ext-core/Language/Core/Core.hs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/utils/ext-core/Language/Core/Core.hs b/utils/ext-core/Language/Core/Core.hs index 74442bd..2b98ab7 100644 --- a/utils/ext-core/Language/Core/Core.hs +++ b/utils/ext-core/Language/Core/Core.hs @@ -5,6 +5,7 @@ import Language.Core.Encoding import Data.Generics import Data.List (elemIndex) +import Data.Char data Module = Module AnMname [Tdef] [Vdefg] @@ -102,7 +103,7 @@ data CoercionKind = -- either type constructors or coercion names onto either -- kinds or coercion kinds. data KindOrCoercion = Kind Kind | Coercion CoercionKind - + data Lit = Literal CoreLit Ty deriving (Data, Typeable, Eq) @@ -251,7 +252,15 @@ tUtuple ts = foldl Tapp (Tcon (tcUtuple (length ts))) ts isUtupleTy :: Ty -> Bool isUtupleTy (Tapp t _) = isUtupleTy t -isUtupleTy (Tcon tc) = tc `elem` [tcUtuple n | n <- [1..maxUtuple]] +isUtupleTy (Tcon tc) = + case tc of + (Just pm, 'Z':rest) | pm == primMname && last rest == 'H' -> + let mid = take ((length rest) - 1) rest in + all isDigit mid && (let num = read mid in + 1 <= num && num <= maxUtuple) + _ -> False +-- The above is ugly, but less ugly than this: +--tc `elem` [tcUtuple n | n <- [1..maxUtuple]] isUtupleTy _ = False dcUtuple :: Int -> Qual Dcon -- 1.7.10.4