{-# LANGUAGE Safe, TypeOperators, BangPatterns, DataKinds, TypeFamilies, FlexibleContexts, FlexibleInstances #-} module Type.BST.Sum ( -- * Sum Sum(Head, Tail) ) where -- | Dependently-typed sum. data family Sum (as :: [*]) data instance Sum '[] data instance Sum (a ': as) = Head a | Tail (Sum as) instance Show (Sum '[]) where show !_ = undefined instance (Show a, Show (Sum as)) => Show (Sum (a ': as)) where showsPrec p (Head x) = showParen (p > 10) $ showString " " . showsPrec 11 x showsPrec p (Tail s) = showsPrec p s