packages feed

bff-mono-0.2.2: Data/BffMono/EquivWitness.hs

{-# LANGUAGE FlexibleContexts, RankNTypes  #-}
{-| 
  A restricted version of @EquivMap@, which just records equivalence. 
 -} 
module Data.BffMono.EquivWitness 
     (
       EquivWitness
     , equals, equate, empty
     , emptyMap 
     )
    where 

import qualified Data.BffMono.EquivMap as EM 


newtype EquivWitness k = EquivWitness (forall a. EM.EquivMap k a)

emptyMap :: EquivWitness k -> EM.EquivMap k a 
emptyMap (EquivWitness w) = w 

empty :: EquivWitness k 
empty = EquivWitness EM.empty 

equals :: Ord k => k -> k -> EquivWitness k -> (Bool , EquivWitness k)
equals x y (EquivWitness t) =
    let (r,t') = EM.equals x y t
    in (r, EquivWitness t') 

equate :: Ord k => k -> k -> EquivWitness k -> EquivWitness k 
equate x y (EquivWitness t) =
    let t' = EM.equate x y t 
    in EquivWitness t'