usb-id-database-0.4.0.1: System/USB/IDDB/Base.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE UnicodeSyntax #-}
module System.USB.IDDB.Base
( IDDB(..)
, ProductDB
, ClassDB, SubClassDB, ProtocolDB
, emptyDb
, vendorName
, vendorId
, productName
, productId
, className
, subClassName
, protocolName
, audioClassTerminalTypeName
, videoClassTerminalTypeName
, hidDescTypeName
, hidDescItemName
, hidDescCountryCodeName
, hidUsagePageName
, hidUsageName
, physicalDescBiasName
, physicalDescItemName
, langName
, subLangName
, getDataFileName
)
where
-- base
import Control.Monad ( (=<<), fmap )
import Data.Char ( String )
import Data.Function ( ($) )
import Data.Int ( Int )
import Data.Maybe ( Maybe )
import Data.Tuple ( fst, snd )
-- base-unicode-symbols
import Prelude.Unicode ( (∘) )
-- containers
import qualified Data.IntMap as IM
import qualified Data.Map as MP
-- containers-unicode-symbols
import qualified Data.IntMap.Unicode as IM ( (∅) )
import qualified Data.Map.Unicode as MP ( (∅) )
#ifdef BUILD_WITH_CABAL
import Paths_usb_id_database ( getDataFileName )
#else
import Control.Monad ( return )
import System.IO ( IO, FilePath )
getDataFileName ∷ FilePath → IO FilePath
getDataFileName = return
#endif
-------------------------------------------------------------------------------
-- Types
-------------------------------------------------------------------------------
type ProductDB = ( MP.Map String Int
, IM.IntMap String
)
type ClassDB = IM.IntMap (String, SubClassDB)
type SubClassDB = IM.IntMap (String, ProtocolDB)
type ProtocolDB = IM.IntMap String
-- |A database of USB identifiers. Contains both vendor identifiers and product
-- identifiers.
data IDDB = IDDB { dbVendorNameId ∷ MP.Map String Int
, dbVendorIdName ∷ IM.IntMap String
, dbProducts ∷ IM.IntMap ProductDB
, dbClasses ∷ ClassDB
, dbAudioCTType ∷ IM.IntMap String
, dbVideoCTType ∷ IM.IntMap String
, dbHIDDescType ∷ IM.IntMap String
, dbHIDDescItem ∷ IM.IntMap String
, dbHIDDescCCode ∷ IM.IntMap String
, dbHIDUsage ∷ IM.IntMap (String, IM.IntMap String)
, dbPhysDescBias ∷ IM.IntMap String
, dbPhysDescItem ∷ IM.IntMap String
, dbLanguages ∷ IM.IntMap (String, IM.IntMap String)
}
-- |An empty database.
emptyDb ∷ IDDB
emptyDb = IDDB { dbVendorNameId = (MP.∅)
, dbVendorIdName = (IM.∅)
, dbProducts = (IM.∅)
, dbClasses = (IM.∅)
, dbAudioCTType = (IM.∅)
, dbVideoCTType = (IM.∅)
, dbHIDDescType = (IM.∅)
, dbHIDDescItem = (IM.∅)
, dbHIDDescCCode = (IM.∅)
, dbHIDUsage = (IM.∅)
, dbPhysDescBias = (IM.∅)
, dbPhysDescItem = (IM.∅)
, dbLanguages = (IM.∅)
}
-------------------------------------------------------------------------------
-- Query database
-------------------------------------------------------------------------------
vendorName ∷ IDDB -- ^Database
→ Int -- ^Vendor identifier
→ Maybe String
vendorName db vid = IM.lookup vid $ dbVendorIdName db
vendorId ∷ IDDB -- ^Database
→ String -- ^Vendor name
→ Maybe Int
vendorId db name = MP.lookup name $ dbVendorNameId db
productName ∷ IDDB -- ^Database
→ Int -- ^Vendor identifier
→ Int -- ^Product identifier
→ Maybe String
productName db vid pid = IM.lookup pid ∘ snd =<< IM.lookup vid (dbProducts db)
productId ∷ IDDB -- ^Database
→ Int -- ^Vendor identifier
→ String -- ^Product name
→ Maybe Int
productId db vid name = MP.lookup name ∘ fst =<< IM.lookup vid (dbProducts db)
className ∷ IDDB -- ^Database
→ Int -- ^Class identifier
→ Maybe String
className db cid = fmap fst ∘ IM.lookup cid $ dbClasses db
subClassName ∷ IDDB -- ^Database
→ Int -- ^Class identifier
→ Int -- ^Sub class identifier
→ Maybe String
subClassName db cid scid = fmap fst $ IM.lookup scid ∘ snd
=<< IM.lookup cid (dbClasses db)
protocolName ∷ IDDB -- ^Database
→ Int -- ^Class identifier
→ Int -- ^Sub class identifier
→ Int -- ^Protocol identifier
→ Maybe String
protocolName db cid scid protId = IM.lookup protId ∘ snd
=<< IM.lookup scid ∘ snd
=<< IM.lookup cid (dbClasses db)
audioClassTerminalTypeName ∷ IDDB -- ^Database
→ Int -- ^Audio class terminal type identifier
→ Maybe String
audioClassTerminalTypeName db actid = IM.lookup actid (dbAudioCTType db)
videoClassTerminalTypeName ∷ IDDB -- ^Database
→ Int -- ^Video class terminal type identifier
→ Maybe String
videoClassTerminalTypeName db actid = IM.lookup actid (dbVideoCTType db)
hidDescTypeName ∷ IDDB -- ^Database
→ Int -- ^HID descriptor type identifier
→ Maybe String
hidDescTypeName db hidid = IM.lookup hidid (dbHIDDescType db)
hidDescItemName ∷ IDDB -- ^Database
→ Int -- ^HID descriptor item identifier
→ Maybe String
hidDescItemName db hidid = IM.lookup hidid (dbHIDDescItem db)
hidDescCountryCodeName ∷ IDDB -- ^Database
→ Int -- ^HID descriptor country code identifier
→ Maybe String
hidDescCountryCodeName db hidid = IM.lookup hidid (dbHIDDescCCode db)
hidUsagePageName ∷ IDDB -- ^Database
→ Int -- ^HID usage page identifier
→ Maybe String
hidUsagePageName db upid = fmap fst $ IM.lookup upid (dbHIDUsage db)
hidUsageName ∷ IDDB -- ^Database
→ Int -- ^HID usage page identifier
→ Int -- ^HID usage identifier
→ Maybe String
hidUsageName db upid uid = IM.lookup uid ∘ snd
=<< IM.lookup upid (dbHIDUsage db)
physicalDescBiasName ∷ IDDB -- ^Database
→ Int -- ^Physical descriptor bias identifier
→ Maybe String
physicalDescBiasName db phyid = IM.lookup phyid (dbPhysDescBias db)
physicalDescItemName ∷ IDDB -- ^Database
→ Int -- ^Physical descriptor item identifier
→ Maybe String
physicalDescItemName db phyid = IM.lookup phyid (dbPhysDescItem db)
langName ∷ IDDB -- ^Database
→ Int -- ^Primary language identifier
→ Maybe String
langName db lid = fmap fst ∘ IM.lookup lid $ dbLanguages db
subLangName ∷ IDDB -- ^Database
→ Int -- ^Primary language identifier
→ Int -- ^Sub language identifier
→ Maybe String
subLangName db lid slid = IM.lookup slid ∘ snd
=<< IM.lookup lid (dbLanguages db)