From 1543e75f50f7b68183a1c4ec5b752202c2ac9a3a Mon Sep 17 00:00:00 2001 From: Henning Guenther Date: Tue, 24 Feb 2009 19:51:50 -0800 Subject: [PATCH] Added Eq instance for DynEncoding This envolves adding the requirement, that every Encoding must also be an instance of Eq and Typeable to go into DynEncoding. darcs-hash:20090225035150-a4fee-c7d902e28313929ee9ffe0c6a6b60d8ff4704ae9 --- Data/Encoding.hs | 10 +--------- Data/Encoding/Base.hs | 17 +++++++++++++++++ Data/Encoding/CP1250.hs | 2 +- Data/Encoding/CP1251.hs | 2 +- Data/Encoding/CP1252.hs | 2 +- Data/Encoding/CP1253.hs | 2 +- Data/Encoding/CP1254.hs | 2 +- Data/Encoding/CP1255.hs | 2 +- Data/Encoding/CP1256.hs | 2 +- Data/Encoding/CP1257.hs | 2 +- Data/Encoding/CP1258.hs | 2 +- Data/Encoding/Helper/Template.hs | 7 ++++--- Data/Encoding/ISO88591.hs | 4 +++- Data/Encoding/ISO885910.hs | 2 +- Data/Encoding/ISO885911.hs | 2 +- Data/Encoding/ISO885913.hs | 2 +- Data/Encoding/ISO885914.hs | 2 +- Data/Encoding/ISO885915.hs | 2 +- Data/Encoding/ISO885916.hs | 2 +- Data/Encoding/ISO88592.hs | 2 +- Data/Encoding/ISO88593.hs | 2 +- Data/Encoding/ISO88594.hs | 2 +- Data/Encoding/ISO88595.hs | 2 +- Data/Encoding/ISO88596.hs | 2 +- Data/Encoding/ISO88597.hs | 2 +- Data/Encoding/ISO88598.hs | 2 +- Data/Encoding/ISO88599.hs | 2 +- Data/Encoding/JISX0201.hs | 2 +- Data/Encoding/JISX0208.hs | 2 +- 29 files changed, 50 insertions(+), 38 deletions(-) diff --git a/Data/Encoding.hs b/Data/Encoding.hs index 92bf0ce..6905a03 100644 --- a/Data/Encoding.hs +++ b/Data/Encoding.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE FlexibleContexts,ExistentialQuantification #-} +{-# LANGUAGE FlexibleContexts #-} module Data.Encoding (module Data.Encoding.Exception ,module Data.Encoding.ByteSource @@ -77,14 +77,6 @@ import Data.Encoding.JISX0208 import Data.Char import Text.Regex -data DynEncoding = forall enc. Encoding enc => DynEncoding enc - -instance Encoding DynEncoding where - decodeChar (DynEncoding e) = decodeChar e - encodeChar (DynEncoding e) = encodeChar e - decode (DynEncoding e) = decode e - encode (DynEncoding e) = encode e - recode :: (Encoding enc1,Encoding enc2,ByteSource m,ByteSink m) => enc1 -> enc2 -> m () recode e1 e2 = untilM_ sourceEmpty (decodeChar e1 >>= encodeChar e2) diff --git a/Data/Encoding/Base.hs b/Data/Encoding/Base.hs index 9dc3312..2934633 100644 --- a/Data/Encoding/Base.hs +++ b/Data/Encoding/Base.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE ExistentialQuantification #-} module Data.Encoding.Base where import Data.Encoding.Exception @@ -9,6 +10,7 @@ import Data.Array as Array import Data.Map as Map hiding ((!)) import Data.Word import Data.Char +import Data.Typeable class Encoding enc where decodeChar :: ByteSource m => enc -> m Char @@ -17,6 +19,21 @@ class Encoding enc where decode e = untilM sourceEmpty (decodeChar e) encode :: ByteSink m => enc -> String -> m () encode e = mapM_ (encodeChar e) + encodeable :: enc -> Char -> Bool + +data DynEncoding = forall enc. (Encoding enc,Eq enc,Typeable enc) => DynEncoding enc + +instance Encoding DynEncoding where + decodeChar (DynEncoding e) = decodeChar e + encodeChar (DynEncoding e) = encodeChar e + decode (DynEncoding e) = decode e + encode (DynEncoding e) = encode e + encodeable (DynEncoding e) = encodeable e + +instance Eq DynEncoding where + (DynEncoding e1) == (DynEncoding e2) = case cast e2 of + Nothing -> False + Just e2' -> e1==e2' untilM :: Monad m => m Bool -> m a -> m [a] untilM check act = do diff --git a/Data/Encoding/CP1250.hs b/Data/Encoding/CP1250.hs index 786407b..0dfa490 100644 --- a/Data/Encoding/CP1250.hs +++ b/Data/Encoding/CP1250.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1250 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1251.hs b/Data/Encoding/CP1251.hs index ec65c08..8ecd481 100644 --- a/Data/Encoding/CP1251.hs +++ b/Data/Encoding/CP1251.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1251 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1252.hs b/Data/Encoding/CP1252.hs index 169dfb9..693e2d6 100644 --- a/Data/Encoding/CP1252.hs +++ b/Data/Encoding/CP1252.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1252 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1253.hs b/Data/Encoding/CP1253.hs index efcbc16..b3bc1bb 100644 --- a/Data/Encoding/CP1253.hs +++ b/Data/Encoding/CP1253.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1253 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1254.hs b/Data/Encoding/CP1254.hs index 434b214..e50c1bb 100644 --- a/Data/Encoding/CP1254.hs +++ b/Data/Encoding/CP1254.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1254 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1255.hs b/Data/Encoding/CP1255.hs index 5ec464e..0e24ac6 100644 --- a/Data/Encoding/CP1255.hs +++ b/Data/Encoding/CP1255.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1255 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1256.hs b/Data/Encoding/CP1256.hs index f05e5a3..ab01359 100644 --- a/Data/Encoding/CP1256.hs +++ b/Data/Encoding/CP1256.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1256 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1257.hs b/Data/Encoding/CP1257.hs index bcd7683..d1523b9 100644 --- a/Data/Encoding/CP1257.hs +++ b/Data/Encoding/CP1257.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1257 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/CP1258.hs b/Data/Encoding/CP1258.hs index 4183b91..c4d256e 100644 --- a/Data/Encoding/CP1258.hs +++ b/Data/Encoding/CP1258.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.CP1258 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/Helper/Template.hs b/Data/Encoding/Helper/Template.hs index fa55977..68233b7 100644 --- a/Data/Encoding/Helper/Template.hs +++ b/Data/Encoding/Helper/Template.hs @@ -7,6 +7,7 @@ import Data.Char import Data.Maybe (mapMaybe) import Data.Map as Map (fromList,lookup) import Data.Array +import Data.Typeable import Language.Haskell.TH makeISOInstance :: String -> FilePath -> Q [Dec] @@ -23,9 +24,9 @@ makeJISInstance name file = do arr <- decodingArray2 (fillTranslations (0x21,0x21) (0x7E,0x7E) trans) return $ encodingInstance 'encodeWithMap2 'decodeWithArray2 name mp arr -encodingInstance :: Name -> Name -> String -> Exp -> Exp -> [Dec] -encodingInstance enc dec name mp arr - = [ DataD [] rname [] [NormalC rname []] [''Show] +encodingInstance :: Name -> Name -> Name -> String -> Exp -> Exp -> [Dec] +encodingInstance enc dec able name mp arr + = [ DataD [] rname [] [NormalC rname []] [''Show,''Eq,''Typeable] , InstanceD [] (AppT (ConT ''Encoding) (ConT rname)) [FunD 'encodeChar [Clause [WildP] (NormalB $ AppE (VarE enc) (VarE rmp)) diff --git a/Data/Encoding/ISO88591.hs b/Data/Encoding/ISO88591.hs index 0730c87..8ccff3b 100644 --- a/Data/Encoding/ISO88591.hs +++ b/Data/Encoding/ISO88591.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE DeriveDataTypeable #-} module Data.Encoding.ISO88591 where import Control.Throws @@ -6,8 +7,9 @@ import Data.Encoding.Exception import Data.Encoding.ByteSource import Data.Encoding.ByteSink import Data.Char (ord,chr) +import Data.Typeable -data ISO88591 = ISO88591 deriving (Show) +data ISO88591 = ISO88591 deriving (Show,Eq,Typeable) instance Encoding ISO88591 where encodeChar _ c diff --git a/Data/Encoding/ISO885910.hs b/Data/Encoding/ISO885910.hs index 35cccb5..c156df7 100644 --- a/Data/Encoding/ISO885910.hs +++ b/Data/Encoding/ISO885910.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO885910 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO885911.hs b/Data/Encoding/ISO885911.hs index 58b4467..dd7a724 100644 --- a/Data/Encoding/ISO885911.hs +++ b/Data/Encoding/ISO885911.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO885911 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO885913.hs b/Data/Encoding/ISO885913.hs index 71baf92..6a4b6ad 100644 --- a/Data/Encoding/ISO885913.hs +++ b/Data/Encoding/ISO885913.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO885913 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO885914.hs b/Data/Encoding/ISO885914.hs index c6b7710..4b526b3 100644 --- a/Data/Encoding/ISO885914.hs +++ b/Data/Encoding/ISO885914.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO885914 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO885915.hs b/Data/Encoding/ISO885915.hs index 46598ef..3fe44ea 100644 --- a/Data/Encoding/ISO885915.hs +++ b/Data/Encoding/ISO885915.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO885915 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO885916.hs b/Data/Encoding/ISO885916.hs index eab1410..d4e71b2 100644 --- a/Data/Encoding/ISO885916.hs +++ b/Data/Encoding/ISO885916.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO885916 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88592.hs b/Data/Encoding/ISO88592.hs index 3dcd9fa..21aeb84 100644 --- a/Data/Encoding/ISO88592.hs +++ b/Data/Encoding/ISO88592.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88592 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88593.hs b/Data/Encoding/ISO88593.hs index 77a1c7a..6c87a36 100644 --- a/Data/Encoding/ISO88593.hs +++ b/Data/Encoding/ISO88593.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88593 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88594.hs b/Data/Encoding/ISO88594.hs index f852a07..7132247 100644 --- a/Data/Encoding/ISO88594.hs +++ b/Data/Encoding/ISO88594.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88594 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88595.hs b/Data/Encoding/ISO88595.hs index 03527db..c7c0a62 100644 --- a/Data/Encoding/ISO88595.hs +++ b/Data/Encoding/ISO88595.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88595 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88596.hs b/Data/Encoding/ISO88596.hs index daaf011..af7d37e 100644 --- a/Data/Encoding/ISO88596.hs +++ b/Data/Encoding/ISO88596.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88596 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88597.hs b/Data/Encoding/ISO88597.hs index fd11748..31f25a7 100644 --- a/Data/Encoding/ISO88597.hs +++ b/Data/Encoding/ISO88597.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88597 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88598.hs b/Data/Encoding/ISO88598.hs index d736e94..7adc85d 100644 --- a/Data/Encoding/ISO88598.hs +++ b/Data/Encoding/ISO88598.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88598 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/ISO88599.hs b/Data/Encoding/ISO88599.hs index 26b9c91..904c02d 100644 --- a/Data/Encoding/ISO88599.hs +++ b/Data/Encoding/ISO88599.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.ISO88599 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/JISX0201.hs b/Data/Encoding/JISX0201.hs index eed0b48..d87c0bc 100644 --- a/Data/Encoding/JISX0201.hs +++ b/Data/Encoding/JISX0201.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.JISX0201 where import Data.Encoding.Helper.Template (makeISOInstance) diff --git a/Data/Encoding/JISX0208.hs b/Data/Encoding/JISX0208.hs index ec9c371..8f99fa7 100644 --- a/Data/Encoding/JISX0208.hs +++ b/Data/Encoding/JISX0208.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-} module Data.Encoding.JISX0208 where import Data.Encoding.Helper.Template (makeJISInstance)