module Fingerprint ( fingerprints ) where import Data.Char (ord) import Data.IntegralLike import Data.List (foldl') import Data.Map (Map) import qualified Data.Map as Map import Instruction import qualified Fingerprint.BASE as BASE import qualified Fingerprint.BOOL as BOOL import qualified Fingerprint.CPLI as CPLI import qualified Fingerprint.FIXP as FIXP import qualified Fingerprint.MODE as MODE import qualified Fingerprint.MODU as MODU import qualified Fingerprint.NULL as NULL import qualified Fingerprint.ORTH as ORTH import qualified Fingerprint.REFC as REFC import qualified Fingerprint.ROMA as ROMA ----------------------------------------------------------- type Fingerprints i = Map Integer [(i, Instruction i ())] mapFst :: (a -> c) -> (a, b) -> (c, b) mapFst f (x, y) = (f x, y) mapSnd :: (b -> c) -> (a, b) -> (a, c) mapSnd f (x, y) = (x, f y) asId :: String -> Integer asId = fromIntegral . foldl' (\fId x -> fId * 256 + x) 0 . map ord fingerprints :: (I i) => Fingerprints i fingerprints = foldr (uncurry (insert . asId) . mapSnd (map $ mapFst asIntegral)) Map.empty [ (BASE.name, BASE.semantics) , (BOOL.name, BOOL.semantics) , (CPLI.name, CPLI.semantics) , (FIXP.name, FIXP.semantics) , (MODE.name, MODE.semantics) , (MODU.name, MODU.semantics) , (NULL.name, NULL.semantics) , (ORTH.name, ORTH.semantics) , (REFC.name, REFC.semantics) , (ROMA.name, ROMA.semantics) ] where insert k v m = if Map.member k m then error $ "Fingerprint.fingerprints: Duplicate entry for fingerprint " ++ show k else Map.insert k v m