order-maintenance-0.2.0.0: src/library/Data/Order/Algorithm/Raw.hs
module Data.Order.Algorithm.Raw (
RawOrder,
RawElement,
RawAlgorithm (
RawAlgorithm,
newOrder,
compareElements,
newMinimum,
newMaximum,
newAfter,
newBefore,
delete
)
) where
-- Control
import Control.Monad.ST
-- Data
import Data.STRef
type RawOrder s o = STRef s (o s)
type RawElement s e = STRef s (e s)
data RawAlgorithm s o e = RawAlgorithm {
newOrder :: ST s (RawOrder s o),
compareElements :: RawElement s e -> RawElement s e -> RawOrder s o -> ST s Ordering,
newMinimum :: RawOrder s o -> ST s (RawElement s e),
newMaximum :: RawOrder s o -> ST s (RawElement s e),
newAfter :: RawElement s e -> RawOrder s o -> ST s (RawElement s e),
newBefore :: RawElement s e -> RawOrder s o -> ST s (RawElement s e),
delete :: RawElement s e -> RawOrder s o -> ST s ()
}
{-FIXME:
If we ever allow users to plug in their own algorithms, we have to flag the
respective function as unsafe and point out that referential transparency is
in danger if the algorithm does not fulfill the specification. This is
because element comparison is presented to the user as a pure function. The
important condition is that for any two elements, compareElements must
always return the same result as long as delete is not called on either
element.
-}