{-# LANGUAGE CPP #-}
#include "containers.h"
moduleData.Map.Internal.DebugwhereimportData.Map.Internal (Map (..),size ,delta )importControl.Monad(guard)-- | \(O(n \log n)\). Show the tree that implements the map. The tree is shown-- in a compressed, hanging format. See 'showTreeWith'.showTree ::(Showk ,Showa )=>Map k a ->StringshowTree :: forall k a. (Show k, Show a) => Map k a -> String
showTree Map k a
m =(k -> a -> String) -> Bool -> Bool -> Map k a -> String
forall k a. (k -> a -> String) -> Bool -> Bool -> Map k a -> String
showTreeWith k -> a -> String
forall {a} {a}. (Show a, Show a) => a -> a -> String
showElem Bool
TrueBool
FalseMap k a
m whereshowElem :: a -> a -> String
showElem a
k a
x =a -> String
forall a. Show a => a -> String
showa
k String -> String -> String
forall a. [a] -> [a] -> [a]
++String
":="String -> String -> String
forall a. [a] -> [a] -> [a]
++a -> String
forall a. Show a => a -> String
showa
x {- | \(O(n \log n)\). The expression (@'showTreeWith' showelem hang wide map@) shows
 the tree that implements the map. Elements are shown using the @showElem@ function. If @hang@ is
 'True', a /hanging/ tree is shown otherwise a rotated tree is shown. If
 @wide@ is 'True', an extra wide version is shown.
> Map> let t = fromDistinctAscList [(x,()) | x <- [1..5]]
> Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True False t
> (4,())
> +--(2,())
> | +--(1,())
> | +--(3,())
> +--(5,())
>
> Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True True t
> (4,())
> |
> +--(2,())
> | |
> | +--(1,())
> | |
> | +--(3,())
> |
> +--(5,())
>
> Map> putStrLn $ showTreeWith (\k x -> show (k,x)) False True t
> +--(5,())
> |
> (4,())
> |
> | +--(3,())
> | |
> +--(2,())
> |
> +--(1,())
-}showTreeWith ::(k ->a ->String)->Bool->Bool->Map k a ->StringshowTreeWith :: forall k a. (k -> a -> String) -> Bool -> Bool -> Map k a -> String
showTreeWith k -> a -> String
showelem Bool
hang Bool
wide Map k a
t |Bool
hang =((k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
forall k a.
(k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
showsTreeHang k -> a -> String
showelem Bool
wide []Map k a
t )String
""|Bool
otherwise=((k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
forall k a.
(k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
showsTree k -> a -> String
showelem Bool
wide [][]Map k a
t )String
""showsTree ::(k ->a ->String)->Bool->[String]->[String]->Map k a ->ShowSshowsTree :: forall k a.
(k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
showsTree k -> a -> String
showelem Bool
wide [String]
lbars [String]
rbars Map k a
t =caseMap k a
t ofMap k a
Tip ->[String] -> String -> String
showsBars [String]
lbars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"|\n"Bin Size
_k
kx a
x Map k a
Tip Map k a
Tip ->[String] -> String -> String
showsBars [String]
lbars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showString(k -> a -> String
showelem k
kx a
x )(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"\n"Bin Size
_k
kx a
x Map k a
l Map k a
r ->(k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
forall k a.
(k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
showsTree k -> a -> String
showelem Bool
wide ([String] -> [String]
withBar [String]
rbars )([String] -> [String]
withEmpty [String]
rbars )Map k a
r (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Bool -> [String] -> String -> String
showWide Bool
wide [String]
rbars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[String] -> String -> String
showsBars [String]
lbars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showString(k -> a -> String
showelem k
kx a
x )(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"\n"(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Bool -> [String] -> String -> String
showWide Bool
wide [String]
lbars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
forall k a.
(k -> a -> String)
-> Bool -> [String] -> [String] -> Map k a -> String -> String
showsTree k -> a -> String
showelem Bool
wide ([String] -> [String]
withEmpty [String]
lbars )([String] -> [String]
withBar [String]
lbars )Map k a
l showsTreeHang ::(k ->a ->String)->Bool->[String]->Map k a ->ShowSshowsTreeHang :: forall k a.
(k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
showsTreeHang k -> a -> String
showelem Bool
wide [String]
bars Map k a
t =caseMap k a
t ofMap k a
Tip ->[String] -> String -> String
showsBars [String]
bars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"|\n"Bin Size
_k
kx a
x Map k a
Tip Map k a
Tip ->[String] -> String -> String
showsBars [String]
bars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showString(k -> a -> String
showelem k
kx a
x )(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"\n"Bin Size
_k
kx a
x Map k a
l Map k a
r ->[String] -> String -> String
showsBars [String]
bars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showString(k -> a -> String
showelem k
kx a
x )(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"\n"(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Bool -> [String] -> String -> String
showWide Bool
wide [String]
bars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
forall k a.
(k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
showsTreeHang k -> a -> String
showelem Bool
wide ([String] -> [String]
withBar [String]
bars )Map k a
l (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Bool -> [String] -> String -> String
showWide Bool
wide [String]
bars (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
forall k a.
(k -> a -> String)
-> Bool -> [String] -> Map k a -> String -> String
showsTreeHang k -> a -> String
showelem Bool
wide ([String] -> [String]
withEmpty [String]
bars )Map k a
r showWide ::Bool->[String]->String->StringshowWide :: Bool -> [String] -> String -> String
showWide Bool
wide [String]
bars |Bool
wide =String -> String -> String
showString([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat([String] -> [String]
forall a. [a] -> [a]
reverse[String]
bars ))(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
"|\n"|Bool
otherwise=String -> String
forall a. a -> a
idshowsBars ::[String]->ShowSshowsBars :: [String] -> String -> String
showsBars [String]
bars =case[String]
bars of[]->String -> String
forall a. a -> a
idString
_:[String]
tl ->String -> String -> String
showString([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat([String] -> [String]
forall a. [a] -> [a]
reverse[String]
tl ))(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> String -> String
showStringString
node node ::Stringnode :: String
node =String
"+--"withBar ,withEmpty ::[String]->[String]withBar :: [String] -> [String]
withBar [String]
bars =String
"| "String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
bars withEmpty :: [String] -> [String]
withEmpty [String]
bars =String
" "String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
bars {--------------------------------------------------------------------
 Assertions
--------------------------------------------------------------------}-- | \(O(n)\). Test if the internal map structure is valid.---- > valid (fromAscList [(3,"b"), (5,"a")]) == True-- > valid (fromAscList [(5,"a"), (3,"b")]) == Falsevalid ::Ordk =>Map k a ->Boolvalid :: forall k a. Ord k => Map k a -> Bool
valid Map k a
t =Map k a -> Bool
forall k a. Map k a -> Bool
balanced Map k a
t Bool -> Bool -> Bool
&&Map k a -> Bool
forall k a. Ord k => Map k a -> Bool
ordered Map k a
t Bool -> Bool -> Bool
&&Map k a -> Bool
forall k a. Map k a -> Bool
validsize Map k a
t -- | Test if the keys are ordered correctly.ordered ::Orda =>Map a b ->Boolordered :: forall k a. Ord k => Map k a -> Bool
ordered Map a b
t =(a -> Bool) -> (a -> Bool) -> Map a b -> Bool
forall {t} {a}.
Ord t =>
(t -> Bool) -> (t -> Bool) -> Map t a -> Bool
bounded (Bool -> a -> Bool
forall a b. a -> b -> a
constBool
True)(Bool -> a -> Bool
forall a b. a -> b -> a
constBool
True)Map a b
t wherebounded :: (t -> Bool) -> (t -> Bool) -> Map t a -> Bool
bounded t -> Bool
lo t -> Bool
hi Map t a
t' =caseMap t a
t' ofMap t a
Tip ->Bool
TrueBin Size
_t
kx a
_Map t a
l Map t a
r ->(t -> Bool
lo t
kx )Bool -> Bool -> Bool
&&(t -> Bool
hi t
kx )Bool -> Bool -> Bool
&&(t -> Bool) -> (t -> Bool) -> Map t a -> Bool
bounded t -> Bool
lo (t -> t -> Bool
forall a. Ord a => a -> a -> Bool
<t
kx )Map t a
l Bool -> Bool -> Bool
&&(t -> Bool) -> (t -> Bool) -> Map t a -> Bool
bounded (t -> t -> Bool
forall a. Ord a => a -> a -> Bool
>t
kx )t -> Bool
hi Map t a
r -- | Test if a map obeys the balance invariants.balanced ::Map k a ->Boolbalanced :: forall k a. Map k a -> Bool
balanced Map k a
t =caseMap k a
t ofMap k a
Tip ->Bool
TrueBin Size
_k
_a
_Map k a
l Map k a
r ->(Map k a -> Size
forall k a. Map k a -> Size
size Map k a
l Size -> Size -> Size
forall a. Num a => a -> a -> a
+Map k a -> Size
forall k a. Map k a -> Size
size Map k a
r Size -> Size -> Bool
forall a. Ord a => a -> a -> Bool
<=Size
1Bool -> Bool -> Bool
||(Map k a -> Size
forall k a. Map k a -> Size
size Map k a
l Size -> Size -> Bool
forall a. Ord a => a -> a -> Bool
<=Size
delta Size -> Size -> Size
forall a. Num a => a -> a -> a
*Map k a -> Size
forall k a. Map k a -> Size
size Map k a
r Bool -> Bool -> Bool
&&Map k a -> Size
forall k a. Map k a -> Size
size Map k a
r Size -> Size -> Bool
forall a. Ord a => a -> a -> Bool
<=Size
delta Size -> Size -> Size
forall a. Num a => a -> a -> a
*Map k a -> Size
forall k a. Map k a -> Size
size Map k a
l ))Bool -> Bool -> Bool
&&Map k a -> Bool
forall k a. Map k a -> Bool
balanced Map k a
l Bool -> Bool -> Bool
&&Map k a -> Bool
forall k a. Map k a -> Bool
balanced Map k a
r -- | Test if each node of a map reports its size correctly.validsize ::Map a b ->Boolvalidsize :: forall k a. Map k a -> Bool
validsize Map a b
t =caseMap a b -> Maybe Size
forall {k} {a}. Map k a -> Maybe Size
slowSize Map a b
t ofMaybe Size
Nothing->Bool
FalseJustSize
_->Bool
TruewhereslowSize :: Map k a -> Maybe Size
slowSize Map k a
Tip =Size -> Maybe Size
forall a. a -> Maybe a
JustSize
0slowSize (Bin Size
sz k
_a
_Map k a
l Map k a
r )=doSize
ls <-Map k a -> Maybe Size
slowSize Map k a
l Size
rs <-Map k a -> Maybe Size
slowSize Map k a
r Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard(Size
sz Size -> Size -> Bool
forall a. Eq a => a -> a -> Bool
==Size
ls Size -> Size -> Size
forall a. Num a => a -> a -> a
+Size
rs Size -> Size -> Size
forall a. Num a => a -> a -> a
+Size
1)Size -> Maybe Size
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
returnSize
sz 

AltStyle によって変換されたページ (->オリジナル) /