module Mischief.ECS.Collectable where class Idk x y class (Semigroup s) => EraseIntoStorage v s where erase :: v -> s class Collectable v storage where collect :: v -> storage instance (EraseIntoStorage v storage) => Collectable v storage where collect :: v -> storage collect = v -> storage forall v storage. EraseIntoStorage v storage => v -> storage erase instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s) => Collectable (a0, a1) s where collect :: (a0, a1) -> s collect (a0 a0, a1 a1) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s) => Collectable (a0, a1, a2) s where collect :: (a0, a1, a2) -> s collect (a0 a0, a1 a1, a2 a2) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s) => Collectable (a0, a1, a2, a3) s where collect :: (a0, a1, a2, a3) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s) => Collectable (a0, a1, a2, a3, a4) s where collect :: (a0, a1, a2, a3, a4) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s) => Collectable (a0, a1, a2, a3, a4, a5) s where collect :: (a0, a1, a2, a3, a4, a5) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s) => Collectable (a0, a1, a2, a3, a4, a5, a6) s where collect :: (a0, a1, a2, a3, a4, a5, a6) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8, a9 a9) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8, a9 -> s forall v storage. Collectable v storage => v -> storage collect a9 a9] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8, a9 a9, a10 a10) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8, a9 -> s forall v storage. Collectable v storage => v -> storage collect a9 a9, a10 -> s forall v storage. Collectable v storage => v -> storage collect a10 a10] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8, a9 a9, a10 a10, a11 a11) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8, a9 -> s forall v storage. Collectable v storage => v -> storage collect a9 a9, a10 -> s forall v storage. Collectable v storage => v -> storage collect a10 a10, a11 -> s forall v storage. Collectable v storage => v -> storage collect a11 a11] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s, Collectable a12 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8, a9 a9, a10 a10, a11 a11, a12 a12) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8, a9 -> s forall v storage. Collectable v storage => v -> storage collect a9 a9, a10 -> s forall v storage. Collectable v storage => v -> storage collect a10 a10, a11 -> s forall v storage. Collectable v storage => v -> storage collect a11 a11, a12 -> s forall v storage. Collectable v storage => v -> storage collect a12 a12] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s, Collectable a12 s, Collectable a13 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8, a9 a9, a10 a10, a11 a11, a12 a12, a13 a13) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8, a9 -> s forall v storage. Collectable v storage => v -> storage collect a9 a9, a10 -> s forall v storage. Collectable v storage => v -> storage collect a10 a10, a11 -> s forall v storage. Collectable v storage => v -> storage collect a11 a11, a12 -> s forall v storage. Collectable v storage => v -> storage collect a12 a12, a13 -> s forall v storage. Collectable v storage => v -> storage collect a13 a13] instance {-# OVERLAPPING #-} (Semigroup s, Collectable a0 s, Collectable a1 s, Collectable a2 s, Collectable a3 s, Collectable a4 s, Collectable a5 s, Collectable a6 s, Collectable a7 s, Collectable a8 s, Collectable a9 s, Collectable a10 s, Collectable a11 s, Collectable a12 s, Collectable a13 s, Collectable a14 s) => Collectable (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) s where collect :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> s collect (a0 a0, a1 a1, a2 a2, a3 a3, a4 a4, a5 a5, a6 a6, a7 a7, a8 a8, a9 a9, a10 a10, a11 a11, a12 a12, a13 a13, a14 a14) = (s -> s -> s) -> s -> [s] -> s forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr s -> s -> s forall a. Semigroup a => a -> a -> a (<>) (a0 -> s forall v storage. Collectable v storage => v -> storage collect a0 a0) [a1 -> s forall v storage. Collectable v storage => v -> storage collect a1 a1, a2 -> s forall v storage. Collectable v storage => v -> storage collect a2 a2, a3 -> s forall v storage. Collectable v storage => v -> storage collect a3 a3, a4 -> s forall v storage. Collectable v storage => v -> storage collect a4 a4, a5 -> s forall v storage. Collectable v storage => v -> storage collect a5 a5, a6 -> s forall v storage. Collectable v storage => v -> storage collect a6 a6, a7 -> s forall v storage. Collectable v storage => v -> storage collect a7 a7, a8 -> s forall v storage. Collectable v storage => v -> storage collect a8 a8, a9 -> s forall v storage. Collectable v storage => v -> storage collect a9 a9, a10 -> s forall v storage. Collectable v storage => v -> storage collect a10 a10, a11 -> s forall v storage. Collectable v storage => v -> storage collect a11 a11, a12 -> s forall v storage. Collectable v storage => v -> storage collect a12 a12, a13 -> s forall v storage. Collectable v storage => v -> storage collect a13 a13, a14 -> s forall v storage. Collectable v storage => v -> storage collect a14 a14]