{-# LANGUAGE TemplateHaskellQuotes #-}

{-|
    Template Haskell helper functions.
 -}

module Data.Patricia.Word.Lazy.TH where

import           Data.Patricia.Word.Lazy.Internal

import           Language.Haskell.TH.Syntax



-- | \(\mathcal{O}(n)\).
--   Evaluate a tree of typed expressions.
sequenceCode :: Quote m => Patricia (Code m a) -> Code m (Patricia a)
sequenceCode :: forall (m :: * -> *) a.
Quote m =>
Patricia (Code m a) -> Code m (Patricia a)
sequenceCode Patricia (Code m a)
t =
  case Patricia (Code m a)
t of
    Bin Prefix
p Patricia (Code m a)
l Patricia (Code m a)
r ->
      [|| Prefix -> Patricia a -> Patricia a -> Patricia a
forall a. Prefix -> Patricia a -> Patricia a -> Patricia a
Bin
            Prefix
p
            $$(Patricia (Code m a) -> Code m (Patricia a)
forall (m :: * -> *) a.
Quote m =>
Patricia (Code m a) -> Code m (Patricia a)
sequenceCode Patricia (Code m a)
l)
            $$(Patricia (Code m a) -> Code m (Patricia a)
forall (m :: * -> *) a.
Quote m =>
Patricia (Code m a) -> Code m (Patricia a)
sequenceCode Patricia (Code m a)
r)
       ||]

    Tip Prefix
k Code m a
a     -> [|| Prefix -> a -> Patricia a
forall a. Prefix -> a -> Patricia a
Tip Prefix
k $$(Code m a
a) ||]
    Patricia (Code m a)
Nil         -> [|| Patricia a
forall a. Patricia a
Nil ||]