radix-tree-1.0.0.2: src/Data/Patricia/Word/Strict/Debug.hs
{-|
Safe functions for datatype introspection.
-}
module Data.Patricia.Word.Strict.Debug
( -- * Show
showsTree
-- * Validate
, Validity (..)
, Reason (..)
, validate
) where
import Data.Patricia.Word.Debug
import Data.Patricia.Word.Strict.Internal
import Numeric.Long
import Radix.Word.Debug
-- | \(\mathcal{O}(n)\).
-- Shows the internal structure of the tree.
showsTree :: (a -> ShowS) -> Patricia a -> ShowS
showsTree f = go 0
where
go i t =
mappend (replicate i ' ') .
case t of
Bin p l r ->
showString "Bin " . showPrefix p . showChar '\n'
. go (i + 2) l . showChar '\n'
. go (i + 2) r
Tip k a ->
showString "Tip " . showLongBin k . showString " => " . f a
Nil -> showString "Nil"
-- | \(\mathcal{O}(n)\).
-- Checks whether the tree is well-formed.
validate :: Patricia a -> Validity
validate t =
case t of
Bin p l r
| p == 0 -> Invalid ZeroPrefix
| otherwise ->
case go L p l of
Valid -> go R p r
err -> err
Tip _ _ -> Valid
Nil -> Valid
where
go s q x =
case x of
Bin p l r
| p == 0 -> Invalid ZeroPrefix
| not $ validPrefix q s p -> Invalid $ PrefixBelow q p
| otherwise ->
case go L p l of
Valid -> go R p r
err -> err
Tip k _
| not $ validKey q s k -> Invalid $ KeyBelow q k
| otherwise -> Valid
Nil -> Invalid $ MalformedBin q