module Data.Order.Pair (
OrderPair,
emptyOrderPair,
emptyOrderPairUsing,
withoutOrder
) where
import Control.Monad.ST
import Data.Order.Pair.Type
import Data.Order.Representation
import Data.Order.Algorithm
import Data.Order.Algorithm.Type
import Data.Order.Algorithm.Raw
import System.IO.Unsafe
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)
emptyOrderRepUsing :: RawAlgorithm RealWorld o e -> OrderRep o e
emptyOrderRepUsing rawAlg = unsafePerformIO $ newOrderRep rawAlg
withoutOrder :: (forall o . OrderPair o a) -> a
withoutOrder (OrderPair (comp, _)) = comp