{-# LANGUAGE DeriveFoldable    #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TypeFamilies      #-}

module Package.C.Type.Tree ( DepTree (..)
                           , DepTreeF (..)
                           , asBldDep
                           ) where

import           Control.Recursion

data DepTree p = DepNode p [DepTree p]
               | BldDepNode p [DepTree p]
    deriving (Functor, Foldable, Traversable)

data DepTreeF p x = DepNodeF { self :: p, deps :: [x] }
                  | BldDepNodeF { self :: p, deps :: [x] }
                  deriving (Functor, Foldable, Traversable)

type instance Base (DepTree a) = DepTreeF a

instance Recursive (DepTree a) where
    project (DepNode p ps)    = DepNodeF p ps
    project (BldDepNode p ps) = BldDepNodeF p ps

asBldDep :: DepTree p -> DepTree p
asBldDep (DepNode p ps)    = BldDepNode p (fmap asBldDep ps)
asBldDep (BldDepNode p ps) = BldDepNode p (fmap asBldDep ps)