packages feed

Fungi-1.0: Fingerprint.hs

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