packages feed

entangle-0.1.0: src/lib/BitQubitId.hs

module BitQubitId (QubitId, BitId, qubitId, toSize) where

newtype QubitId = QubitId Int deriving (Eq, Ord)
newtype BitId = BitId Int deriving (Eq, Ord)

qubitId :: Int -> QubitId
qubitId i
    | i < 0 = error "Negative qubit id"
    | otherwise = QubitId i

bitId :: Int -> BitId
bitId i
    | i < 0 = error "Negative bit id"
    | otherwise = BitId i

liftQubit :: (Int -> Int -> Int) -> QubitId -> QubitId -> QubitId
liftQubit op (QubitId a) (QubitId b) = qubitId $ op a b

instance Show QubitId where
    show (QubitId i) = "qubit " ++ show i

instance Bounded QubitId where
    minBound = QubitId 0
    maxBound = QubitId maxBound

instance Enum QubitId where
    fromEnum (QubitId i) = i
    toEnum = qubitId

instance Num QubitId where
    (+) = liftQubit (+)
    (-) = liftQubit (-)
    fromInteger = qubitId . fromIntegral
    (*) = error "* makes no sense for QubitId"
    abs = error "abs makes no sense for QubitId"
    signum = error "signum makes no sense for QubitId"

instance Show BitId where
    show (BitId i) = "bit " ++ show i

instance Bounded BitId where
    minBound = BitId 0
    maxBound = BitId maxBound

instance Enum BitId where
    fromEnum (BitId i) = i
    toEnum = bitId

toSize :: QubitId -> Integer
toSize (QubitId i) = 2 ^ i