module Data.Patricia.Word.Conversion where

import           Data.Patricia.Word.Lazy.Internal as Lazy
import           Data.Patricia.Word.Strict.Internal as Strict



-- | \(\mathcal{O}(1)\texttt{+}, \mathcal{O}(n)\).
--   Create a lazy 'Lazy.Patricia' tree from a strict one.
--
--   The resulting tree does not share its data representation with the original.
toLazy :: StrictPatricia a -> LazyPatricia a
toLazy :: forall a. StrictPatricia a -> LazyPatricia a
toLazy StrictPatricia a
t =
  case StrictPatricia a
t of
    Strict.Bin Prefix
p StrictPatricia a
l StrictPatricia a
r -> Prefix -> LazyPatricia a -> LazyPatricia a -> LazyPatricia a
forall a. Prefix -> Patricia a -> Patricia a -> Patricia a
Lazy.Bin Prefix
p (StrictPatricia a -> LazyPatricia a
forall a. StrictPatricia a -> LazyPatricia a
toLazy StrictPatricia a
l) (StrictPatricia a -> LazyPatricia a
forall a. StrictPatricia a -> LazyPatricia a
toLazy StrictPatricia a
r)
    Strict.Tip Prefix
k a
a   -> Prefix -> a -> LazyPatricia a
forall a. Prefix -> a -> Patricia a
Lazy.Tip Prefix
k a
a
    StrictPatricia a
Strict.Nil       -> LazyPatricia a
forall a. Patricia a
Lazy.Nil



-- | \(\mathcal{O}(n)\).
--   Create a strict 'Strict.Patricia' tree from a lazy one.
--
--   The resulting tree does not share its data representation with the original.
toStrict :: LazyPatricia a -> StrictPatricia a
toStrict :: forall a. LazyPatricia a -> StrictPatricia a
toStrict LazyPatricia a
t =
  case LazyPatricia a
t of
    Lazy.Bin Prefix
p LazyPatricia a
l LazyPatricia a
r -> Prefix -> StrictPatricia a -> StrictPatricia a -> StrictPatricia a
forall a. Prefix -> Patricia a -> Patricia a -> Patricia a
Strict.Bin Prefix
p (LazyPatricia a -> StrictPatricia a
forall a. LazyPatricia a -> StrictPatricia a
toStrict LazyPatricia a
l) (LazyPatricia a -> StrictPatricia a
forall a. LazyPatricia a -> StrictPatricia a
toStrict LazyPatricia a
r)
    Lazy.Tip Prefix
k a
a   -> Prefix -> a -> StrictPatricia a
forall a. Prefix -> a -> Patricia a
Strict.Tip Prefix
k a
a
    LazyPatricia a
Lazy.Nil       -> StrictPatricia a
forall a. Patricia a
Strict.Nil