{-# LANGUAGE CPP #-}

#define NAME Hash1
#include "Include/Hash.hs"


type Hash k = Set.Set (Int,k)

calcHash :: Ord k => Shell k -> Hash k
calcHash = f Set.empty
    where f x (Shell a b c) = foldl' f (Set.insert (b,a) x) c

-- important: calculate the hash of y only once per invokation
checkHash :: Ord k => Shell k -> Hash k -> Bool
checkHash y = (`Set.isSubsetOf` calcHash y)