{-# LANGUAGE DeriveFunctor #-} module Data.Category where import Data.Text (Text) data Category a = Leaf a | Category Text [Category a] deriving (Show, Functor) foldCategory :: (a -> b) -> (Text -> [b] -> b) -> Category a -> b foldCategory fab f = go where go (Leaf a) = fab a go (Category txt cats) = f txt (map go cats)