{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE StandaloneDeriving #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Database ( Database(..) , lookup , readFile ) where import Prelude hiding (lookup,readFile) import qualified Prelude (readFile) import Data.Data import Data.IxSet.Typed import Network.DNS.Types deriving instance Data OData deriving instance Data Question deriving instance Data RData deriving instance Data ResourceRecord deriving instance Data TYPE deriving instance Ord Question deriving instance Ord ResourceRecord deriving instance Ord TYPE deriving instance Read OData deriving instance Read Question deriving instance Read RData deriving instance Read ResourceRecord type ResourceRecordIxs = '[Domain, TYPE] type IxResourceRecord = IxSet ResourceRecordIxs ResourceRecord data Database = Database { recordSet :: IxResourceRecord } deriving (Read,Show) instance Indexable ResourceRecordIxs ResourceRecord where indices = ixList (ixGen (Proxy :: Proxy Domain)) (ixGen (Proxy :: Proxy TYPE)) lookup :: Question -> Database -> [ResourceRecord] lookup Question{..} (Database ix) = toList (ix @= qname @= qtype) readFile :: FilePath -> IO Database readFile path = read <$> Prelude.readFile path