{-# LANGUAGE TemplateHaskellQuotes #-}

module Data.RadixNTree.Word8.Lazy.TH
  ( RadixTree
  , sequenceCode0

  , Radix1Tree
  , sequenceCode1
  ) where

import           Data.RadixNTree.Word8.Lazy

import           Language.Haskell.TH.Syntax



sequenceCode0 :: Quote m => RadixTree (Code m a) -> Code m (RadixTree a)
sequenceCode0 :: forall (m :: * -> *) a.
Quote m =>
RadixTree (Code m a) -> Code m (RadixTree a)
sequenceCode0 (RadixTree Maybe (Code m a)
mx Radix1Tree (Code m a)
t) =
  [|| Maybe a -> Radix1Tree a -> RadixTree a
forall a. Maybe a -> Radix1Tree a -> RadixTree a
RadixTree $$(Maybe (Code m a) -> Code m (Maybe a)
forall (m :: * -> *) a.
Quote m =>
Maybe (Code m a) -> Code m (Maybe a)
sequenceMaybe Maybe (Code m a)
mx) $$(Radix1Tree (Code m a) -> Code m (Radix1Tree a)
forall (m :: * -> *) a.
Quote m =>
Radix1Tree (Code m a) -> Code m (Radix1Tree a)
sequenceCode1 Radix1Tree (Code m a)
t) ||]

sequenceCode1 :: Quote m => Radix1Tree (Code m a) -> Code m (Radix1Tree a)
sequenceCode1 :: forall (m :: * -> *) a.
Quote m =>
Radix1Tree (Code m a) -> Code m (Radix1Tree a)
sequenceCode1 Radix1Tree (Code m a)
t =
  case Radix1Tree (Code m a)
t of
    Bin Prefix
p Radix1Tree (Code m a)
l Radix1Tree (Code m a)
r     ->
      [|| Prefix -> Radix1Tree a -> Radix1Tree a -> Radix1Tree a
forall a. Prefix -> Radix1Tree a -> Radix1Tree a -> Radix1Tree a
Bin
            Prefix
p
            $$(Radix1Tree (Code m a) -> Code m (Radix1Tree a)
forall (m :: * -> *) a.
Quote m =>
Radix1Tree (Code m a) -> Code m (Radix1Tree a)
sequenceCode1 Radix1Tree (Code m a)
l)
            $$(Radix1Tree (Code m a) -> Code m (Radix1Tree a)
forall (m :: * -> *) a.
Quote m =>
Radix1Tree (Code m a) -> Code m (Radix1Tree a)
sequenceCode1 Radix1Tree (Code m a)
r)
       ||]

    Tip ByteArray
arr Maybe (Code m a)
mx Radix1Tree (Code m a)
dx -> [|| ByteArray -> Maybe a -> Radix1Tree a -> Radix1Tree a
forall a. ByteArray -> Maybe a -> Radix1Tree a -> Radix1Tree a
Tip ByteArray
arr $$(Maybe (Code m a) -> Code m (Maybe a)
forall (m :: * -> *) a.
Quote m =>
Maybe (Code m a) -> Code m (Maybe a)
sequenceMaybe Maybe (Code m a)
mx) $$(Radix1Tree (Code m a) -> Code m (Radix1Tree a)
forall (m :: * -> *) a.
Quote m =>
Radix1Tree (Code m a) -> Code m (Radix1Tree a)
sequenceCode1 Radix1Tree (Code m a)
dx) ||]

    Radix1Tree (Code m a)
Nil           -> [|| Radix1Tree a
forall a. Radix1Tree a
Nil ||]



sequenceMaybe :: Quote m => Maybe (Code m a) -> Code m (Maybe a)
sequenceMaybe :: forall (m :: * -> *) a.
Quote m =>
Maybe (Code m a) -> Code m (Maybe a)
sequenceMaybe Maybe (Code m a)
mx =
  case Maybe (Code m a)
mx of
    Just Code m a
x  -> [|| a -> Maybe a
forall a. a -> Maybe a
Just $$(Code m a
x) ||]
    Maybe (Code m a)
Nothing -> [|| Maybe a
forall a. Maybe a
Nothing ||]