module Data.Order.Pair ( OrderPair, emptyOrderPair, emptyOrderPairUsing, withoutOrder ) where -- Control import Control.Monad.ST -- Data import Data.Order.Pair.Type import Data.Order.Representation import Data.Order.Algorithm import Data.Order.Algorithm.Type import Data.Order.Algorithm.Raw -- System import System.IO.Unsafe -- NOTE: OrderPair is imported from Data.Order.Pair.Type. emptyOrderPair :: a -> OrderPair o a emptyOrderPair = emptyOrderPairUsing defaultAlgorithm emptyOrderPairUsing :: Algorithm -> a -> OrderPair o a emptyOrderPairUsing (Algorithm rawAlg) val = orderPair where orderPair = OrderPair (val, emptyOrderRepUsing rawAlg) {-# NOINLINE emptyOrderRepUsing #-} emptyOrderRepUsing :: RawAlgorithm RealWorld o e -> OrderRep o e emptyOrderRepUsing rawAlg = unsafePerformIO $ newOrderRep rawAlg withoutOrder :: (forall o . OrderPair o a) -> a withoutOrder (OrderPair (comp, _)) = comp