{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Graph.Dynamic.Internal.Tree
( Tree (..)
, concat
, TestTree (..)
) where
import Control.Monad (foldM)
import Control.Monad.Primitive (PrimMonad (..))
import Data.List.NonEmpty (NonEmpty)
import qualified Data.List.NonEmpty as NonEmpty
import Data.Proxy (Proxy)
import Prelude hiding (concat)
class Tree (t :: * -> * -> * -> *) where
type TreeGen t :: * -> *
newTreeGen
:: PrimMonad m => Proxy t -> m (TreeGen t (PrimState m))
singleton
:: (PrimMonad m, Monoid v)
=> TreeGen t (PrimState m) -> a -> v -> m (t (PrimState m) a v)
append
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v -> t (PrimState m) a v
-> m (t (PrimState m) a v)
cons
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v -> t (PrimState m) a v
-> m (t (PrimState m) a v)
cons = append
snoc
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v -> t (PrimState m) a v
-> m (t (PrimState m) a v)
snoc = append
split
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v
-> m (Maybe (t (PrimState m) a v), Maybe (t (PrimState m) a v))
connected
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v -> t (PrimState m) a v
-> m Bool
root
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v
-> m (t (PrimState m) a v)
readRoot
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v
-> m (t (PrimState m) a v)
readRoot = root
label
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v
-> m a
aggregate
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v
-> m v
toList
:: (PrimMonad m, Monoid v)
=> t (PrimState m) a v
-> m [a]
concat
:: forall t m a v. (Tree t, PrimMonad m, Monoid v)
=> NonEmpty (t (PrimState m) a v)
-> m (t (PrimState m) a v)
concat trees0 =
case trees0 of x NonEmpty.:| xs -> foldM append x xs
class Tree t => TestTree t where
print
:: Show a
=> t (PrimState IO) a v -> IO ()
assertInvariants
:: (PrimMonad m, Monoid v, Eq v, Show v)
=> t (PrimState m) a v -> m ()
assertSingleton
:: (PrimMonad m, Monoid v, Eq v, Show v)
=> t (PrimState m) a v -> m ()
assertRoot
:: (PrimMonad m, Monoid v, Eq v, Show v)
=> t (PrimState m) a v -> m ()