radix-tree-1.0.0.0: src/Radix/Common.hs
{-# LANGUAGE GADTs
, UnboxedTuples #-}
module Radix.Common
( PartialOrdering (..)
, order
, S (..)
, other
, limit
) where
-- | Comparison of two sets, \(A\) and \(B\) respectively.
data PartialOrdering = Subset -- ^ \(A \subset B\).
| Superset -- ^ \(A \supset B\).
| Equal -- ^ \(A = B\).
| Incomparable -- ^ \(A \parallel B\).
deriving (Show, Eq)
-- | Comparison of two partial orderings.
order :: PartialOrdering -> PartialOrdering -> PartialOrdering
order Subset Subset = Subset
order Subset Equal = Subset
order Superset Superset = Superset
order Superset Equal = Superset
order Equal o = o
order _ _ = Incomparable
-- | Merge side.
data S a b x y where
L :: S x y x y
R :: S y x x y
-- | The other merge side.
other :: S a b x y -> (# S b a x y #)
other L = (# R #)
other R = (# L #)
-- | Limits the left side to a 'Subset'.
limit :: S x y a b -> PartialOrdering -> PartialOrdering
limit L Superset = Incomparable
limit R Subset = Incomparable
limit s Equal = case s of
L -> Subset
R -> Superset
limit _ o = o