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]