module Data.Order.Representation (

    OrderRep (OrderRep),
    newOrderRep

) where

-- Control

import Control.Monad.ST

-- Data

import Data.Order.Algorithm.Raw
import Data.Order.Gate

data OrderRep o e = OrderRep (RawAlgorithm RealWorld o e) (Gate o)
{-NOTE:
    When using OrderT, reduction of an OrderRep value to WHNF triggers the I/O
    for insertions.
-}

newOrderRep :: RawAlgorithm RealWorld o e -> IO (OrderRep o e)
newOrderRep rawAlg = do
    rawOrder <- stToIO $ newOrder rawAlg
    gate <- newGate rawOrder
    return (OrderRep rawAlg gate)