module System.USB.IDDB.Base
( IDDB(..)
, VendorID, VendorName
, ProductID, ProductName
, emptyDb
, vendorName
, vendorId
, productName
, productId
, getDataFileName
)
where
import Data.ByteString (ByteString)
import qualified Data.Bimap as BM
import qualified Data.Map as MP
#ifdef BUILD_WITH_CABAL
import Paths_usb_id_database (getDataFileName)
#else
getDataFileName :: FilePath -> IO FilePath
getDataFileName = return
#endif
-------------------------------------------------------------------------------
-- Types
-------------------------------------------------------------------------------
type VendorID = Int
type ProductID = Int
type VendorName = ByteString
type ProductName = ByteString
-- |A database of USB identifiers. Contains both vendor identifiers
-- and product identifiers.
data IDDB = IDDB { dbVendors :: BM.Bimap VendorID VendorName
, dbProducts :: MP.Map VendorID (BM.Bimap ProductID ProductName)
}
-- |An empty database.
emptyDb :: IDDB
emptyDb = IDDB { dbVendors = BM.empty
, dbProducts = MP.empty
}
-------------------------------------------------------------------------------
-- Query database
-------------------------------------------------------------------------------
vendorName :: IDDB -> VendorID -> Maybe VendorName
vendorName db vid = BM.lookup vid (dbVendors db)
vendorId :: IDDB -> VendorName -> Maybe VendorID
vendorId db name = BM.lookupR name (dbVendors db)
productName :: IDDB -> VendorID -> ProductID -> Maybe ProductName
productName db vid pid = BM.lookup pid =<< MP.lookup vid (dbProducts db)
productId :: IDDB -> VendorID -> ProductName -> Maybe ProductID
productId db vid name = BM.lookupR name =<< MP.lookup vid (dbProducts db)