{-# LANGUAGE AllowAmbiguousTypes #-}

module Mischief.ECS.Mappable where

import Mischief.ECS.Components
import Mischief.ECS.Entities
import Mischief.ECS.Tables

class Mappable flag a b | flag a -> b where
  mapTuple :: a -> b

class TryMapId flag flag' c out | flag flag' c -> out where
  tryMapId :: c -> out

data RelQueryOutput out = RelQueryOutput out | InvalidRelQueryOutput

type family MapIsId c where
  MapIsId (Maybe a) = False
  MapIsId (Result a) = False
  MapIsId (RelQueryOutput a) = False
  MapIsId [a] = False
  MapIsId a = True

data MapQueryVal

instance TryMapId True MapQueryVal a a where
  tryMapId :: a -> a
tryMapId = a -> a
forall a. a -> a
id

instance TryMapId False MapQueryVal (Result a) a where
  tryMapId :: Result a -> a
tryMapId = Result a -> a
forall a. Result a -> a
value

instance (TryMapId (MapIsId a) MapQueryVal a out) => TryMapId False MapQueryVal (Maybe a) (Maybe out) where
  tryMapId :: Maybe a -> Maybe out
tryMapId = (a -> out) -> Maybe a -> Maybe out
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (flag :: Bool) flag' c out.
TryMapId flag flag' c out =>
c -> out
forall {k} {k} (flag :: k) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
tryMapId @(MapIsId a) @MapQueryVal)

instance (TryMapId (MapIsId a) MapQueryVal a out) => TryMapId False MapQueryVal [a] [out] where
  tryMapId :: [a] -> [out]
tryMapId = (a -> out) -> [a] -> [out]
forall a b. (a -> b) -> [a] -> [b]
map (forall (flag :: Bool) flag' c out.
TryMapId flag flag' c out =>
c -> out
forall {k} {k} (flag :: k) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
tryMapId @(MapIsId a) @MapQueryVal)

instance (TryMapId (MapIsId a) MapQueryVal a out) => TryMapId False MapQueryVal (RelQueryOutput a) (RelQueryOutput out) where
  tryMapId :: RelQueryOutput a -> RelQueryOutput out
tryMapId (RelQueryOutput a
a) = out -> RelQueryOutput out
forall out. out -> RelQueryOutput out
RelQueryOutput (out -> RelQueryOutput out) -> out -> RelQueryOutput out
forall a b. (a -> b) -> a -> b
$ forall (flag :: Bool) flag' c out.
TryMapId flag flag' c out =>
c -> out
forall {k} {k} (flag :: k) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
tryMapId @(MapIsId a) @MapQueryVal a
a
  tryMapId RelQueryOutput a
InvalidRelQueryOutput = RelQueryOutput out
forall out. RelQueryOutput out
InvalidRelQueryOutput

instance {-# OVERLAPPABLE #-} (TryMapId (MapIsId a) flag a out) => Mappable flag a out where
  mapTuple :: a -> out
mapTuple = forall (flag :: Bool) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
forall {k} {k} (flag :: k) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
tryMapId @(MapIsId a) @flag

data MapQueryValidity

instance TryMapId True MapQueryValidity a a where
  tryMapId :: a -> a
tryMapId = a -> a
forall a. a -> a
id

instance TryMapId False MapQueryValidity (Result a) (Result a) where
  tryMapId :: Result a -> Result a
tryMapId = Result a -> Result a
forall a. a -> a
id

instance (TryMapId (MapIsId a) MapQueryValidity a out) => TryMapId False MapQueryValidity (RelQueryOutput a) a where
  tryMapId :: RelQueryOutput a -> a
tryMapId (RelQueryOutput a
a) = a
a
  tryMapId RelQueryOutput a
InvalidRelQueryOutput = a
forall a. HasCallStack => a
undefined

instance (TryMapId (MapIsId a) MapQueryValidity a out) => TryMapId False MapQueryValidity (Maybe a) (Maybe out) where
  tryMapId :: Maybe a -> Maybe out
tryMapId = (a -> out) -> Maybe a -> Maybe out
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (flag :: Bool) flag' c out.
TryMapId flag flag' c out =>
c -> out
forall {k} {k} (flag :: k) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
tryMapId @(MapIsId a) @MapQueryValidity)

instance (TryMapId (MapIsId a) MapQueryValidity a out) => TryMapId False MapQueryValidity [a] [out] where
  tryMapId :: [a] -> [out]
tryMapId = (a -> out) -> [a] -> [out]
forall a b. (a -> b) -> [a] -> [b]
map (forall (flag :: Bool) flag' c out.
TryMapId flag flag' c out =>
c -> out
forall {k} {k} (flag :: k) (flag' :: k) c out.
TryMapId flag flag' c out =>
c -> out
tryMapId @(MapIsId a) @MapQueryValidity)

-- instance {-# OVERLAPPABLE #-} (TryMapId (MapIsId a) MapQueryValidity a out) => Mappable flag a out where
--   mapTuple = tryMapId @(MapIsId a) @MapQueryValidity

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1) => Mappable flag (a0, a1) (b0, b1) where
  mapTuple :: (a0, a1) -> (b0, b1)
mapTuple (a0
a0, a1
a1) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2) => Mappable flag (a0, a1, a2) (b0, b1, b2) where
  mapTuple :: (a0, a1, a2) -> (b0, b1, b2)
mapTuple (a0
a0, a1
a1, a2
a2) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3) => Mappable flag (a0, a1, a2, a3) (b0, b1, b2, b3) where
  mapTuple :: (a0, a1, a2, a3) -> (b0, b1, b2, b3)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4) => Mappable flag (a0, a1, a2, a3, a4) (b0, b1, b2, b3, b4) where
  mapTuple :: (a0, a1, a2, a3, a4) -> (b0, b1, b2, b3, b4)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5) => Mappable flag (a0, a1, a2, a3, a4, a5) (b0, b1, b2, b3, b4, b5) where
  mapTuple :: (a0, a1, a2, a3, a4, a5) -> (b0, b1, b2, b3, b4, b5)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6) => Mappable flag (a0, a1, a2, a3, a4, a5, a6) (b0, b1, b2, b3, b4, b5, b6) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6) -> (b0, b1, b2, b3, b4, b5, b6)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5, a6
a6) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7) (b0, b1, b2, b3, b4, b5, b6, b7) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7)
-> (b0, b1, b2, b3, b4, b5, b6, b7)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5, a6
a6, a7
a7) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8) (b0, b1, b2, b3, b4, b5, b6, b7, b8) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5, a6
a6, a7
a7, a8
a8) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8, Mappable flag a9 b9) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5, a6
a6, a7
a7, a8
a8, a9
a9) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a9
a9)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8, Mappable flag a9 b9, Mappable flag a10 b10) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5, a6
a6, a7
a7, a8
a8, a9
a9, a10
a10) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a9
a9, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a10
a10)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8, Mappable flag a9 b9, Mappable flag a10 b10, Mappable flag a11 b11) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11)
mapTuple (a0
a0, a1
a1, a2
a2, a3
a3, a4
a4, a5
a5, a6
a6, a7
a7, a8
a8, a9
a9, a10
a10, a11
a11) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a9
a9, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a10
a10, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a11
a11)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8, Mappable flag a9 b9, Mappable flag a10 b10, Mappable flag a11 b11, Mappable flag a12 b12) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12)
mapTuple (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) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a9
a9, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a10
a10, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a11
a11, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a12
a12)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8, Mappable flag a9 b9, Mappable flag a10 b10, Mappable flag a11 b11, Mappable flag a12 b12, Mappable flag a13 b13) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13)
mapTuple (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) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a9
a9, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a10
a10, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a11
a11, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a12
a12, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a13
a13)

instance {-# OVERLAPPING #-} (Mappable flag a0 b0, Mappable flag a1 b1, Mappable flag a2 b2, Mappable flag a3 b3, Mappable flag a4 b4, Mappable flag a5 b5, Mappable flag a6 b6, Mappable flag a7 b7, Mappable flag a8 b8, Mappable flag a9 b9, Mappable flag a10 b10, Mappable flag a11 b11, Mappable flag a12 b12, Mappable flag a13 b13, Mappable flag a14 b14) => Mappable flag (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14) where
  mapTuple :: (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
-> (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13,
    b14)
mapTuple (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) = (forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a0
a0, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a1
a1, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a2
a2, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a3
a3, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a4
a4, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a5
a5, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a6
a6, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a7
a7, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a8
a8, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a9
a9, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a10
a10, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a11
a11, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a12
a12, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a13
a13, forall (flag :: k) a b. Mappable flag a b => a -> b
forall {k} (flag :: k) a b. Mappable flag a b => a -> b
mapTuple @flag a14
a14)