module Control.Monad.Trans.Order.Raw ( RawOrder, OrderCell, RawElement, ElementCell, RawAlgorithm ( RawAlgorithm, newOrder, compareElements, insertMinimum, insertMaximum, insertAfter, insertBefore, delete ) ) where import Control.Monad.ST import Data.STRef type RawOrder o s = STRef s (OrderCell o s) type family OrderCell o s type RawElement o s = STRef s (ElementCell o s) type family ElementCell o s data RawAlgorithm o s = RawAlgorithm { newOrder :: ST s (RawOrder o s), compareElements :: RawElement o s -> RawElement o s -> ST s Ordering, insertMinimum :: RawOrder o s -> ST s (RawElement o s), insertMaximum :: RawOrder o s -> ST s (RawElement o s), insertAfter :: RawElement o s -> RawOrder o s -> ST s (RawElement o s), insertBefore :: RawElement o s -> RawOrder o s -> ST s (RawElement o s), delete :: RawElement o s -> RawOrder o s -> ST s () }