module Data.Bijection.Class where class Bijection z where type ContL z :: * type ContR z :: * type ElemL z :: * type ElemR z :: * contL :: z -> ContL z contR :: z -> ContR z memberL :: z -> ElemL z -> Bool memberL = (maybe False (const True) . ) . lookupL memberR :: z -> ElemR z -> Bool memberR = (maybe False (const True) . ) . lookupR lookupL :: z -> ElemL z -> Maybe (ElemR z) lookupR :: z -> ElemR z -> Maybe (ElemL z) empty :: z null :: z -> Bool size :: z -> Int fromList :: [(ElemL z, ElemR z)] -> z toList :: z -> [(ElemL z, ElemR z)] insert :: z -> (ElemL z, ElemR z) -> z deleteByL :: z -> ElemL z -> z deleteByR :: z -> ElemR z -> z {-# INLINE memberL #-} {-# INLINE memberR #-} findWithDefaultL :: Bijection z => ElemR z -> z -> ElemL z -> ElemR z findWithDefaultL def = (maybe def id . ) . lookupL {-# INLINE findWithDefaultL #-} findWithDefaultR :: Bijection z => ElemL z -> z -> ElemR z -> ElemL z findWithDefaultR def = (maybe def id . ) . lookupR {-# INLINE findWithDefaultR #-}