    {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
    module Database.TokyoCabinet.FDB.Key (Key(..), ID(..)) where

    import Database.TokyoCabinet.FDB.C (ID(..), unID)

    import Data.Int
    import Data.Word

    class Key a where
        toID   :: a -> ID
        fromID :: ID -> a

    instance Key Int where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Int8 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Int16 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Int32 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Int64 where
        toID = ID
        fromID = fromIntegral . unID

    instance Key Word8 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Word16 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Word32 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key Word64 where
        toID = ID . fromIntegral
        fromID = fromIntegral . unID

    instance Key ID where
        toID = id
        fromID = id

    instance Key String where
        toID "min"  = IDMIN
        toID "max"  = IDMAX
        toID "prev" = IDPREV
        toID "next" = IDNEXT
        toID idstr  = ID (read idstr)
        fromID = show . unID