module Data.Diverse.Collector where
import Data.Diverse.AFoldable
import Data.Diverse.Emit
import Data.Diverse.Reiterate
import Data.Kind
import GHC.TypeLits
newtype Collector e (xs :: [Type]) r = Collector (e xs r)
instance AFoldable (Collector e '[]) r where
afoldr _ z _ = z
instance ( Emit e (x ': xs) r
, Reiterate e (x ': xs)
, AFoldable (Collector e xs) r
) =>
AFoldable (Collector e (x ': xs)) r where
afoldr f z (Collector e) = f (emit e) (afoldr f z (Collector (reiterate e)))
newtype Collector0 e (xs :: [Type]) r = Collector0 (e xs r)
instance (Emit e '[] r) =>
AFoldable (Collector0 e '[]) r where
afoldr f z (Collector0 e) = f (emit e) z
instance ( Emit e (x ': xs) r
, Reiterate e (x ': xs)
, AFoldable (Collector0 e xs) r
) =>
AFoldable (Collector0 e (x ': xs)) r where
afoldr f z (Collector0 e) = f (emit e) (afoldr f z (Collector0 (reiterate e)))
newtype CollectorN e (n :: Nat) (xs :: [Type]) r = CollectorN (e n xs r)
instance AFoldable (CollectorN e n '[]) r where
afoldr _ z _ = z
instance ( Emit (e n) (x ': xs) r
, ReiterateN e n (x ': xs)
, AFoldable (CollectorN e (n + 1) xs) r
) =>
AFoldable (CollectorN e n (x ': xs)) r where
afoldr f z (CollectorN e) = f (emit e) (afoldr f z (CollectorN (reiterateN e)))
newtype CollectorN0 e (n :: Nat) (xs :: [Type]) r = CollectorN0 (e n xs r)
instance (Emit (e n) '[] r) =>
AFoldable (CollectorN0 e n '[]) r where
afoldr f z (CollectorN0 e) = f (emit e) z
instance ( Emit (e n) (x ': xs) r
, ReiterateN e n (x ': xs)
, AFoldable (CollectorN0 e (n + 1) xs) r
) =>
AFoldable (CollectorN0 e n (x ': xs)) r where
afoldr f z (CollectorN0 e) = f (emit e) (afoldr f z (CollectorN0 (reiterateN e)))