module Data.Sums.Shrinkers where

import Data.Sums

s0 :: S0 -> [S0]
s0 _ = []

s1 :: (a -> [a]) -> S1 a -> [S1 a]
s1 f (S1a a) = map S1a $ f a

s2 :: (a -> [a]) -> (b -> [b]) -> S2 a b -> [S2 a b]
s2 fa fb = caseS2 (map S2a . fa) (map S2b . fb)

s3
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> S3 a b c
  -> [S3 a b c]
s3 fa fb fc = caseS3 (map S3a . fa) (map S3b . fb) (map S3c. fc)

s4
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> S4 a b c d
  -> [S4 a b c d]
s4 fa fb fc fd = caseS4 (map S4a . fa) (map S4b . fb) (map S4c . fc)
   (map S4d . fd)

s5
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> S5 a b c d e
  -> [S5 a b c d e]
s5 fa fb fc fd fe = caseS5 (map S5a . fa) (map S5b . fb) (map S5c . fc)
   (map S5d . fd) (map S5e . fe)

s6
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> S6 a b c d e f
  -> [S6 a b c d e f]
s6 fa fb fc fd fe ff
  = caseS6 (map S6a . fa) (map S6b . fb) (map S6c . fc)
   (map S6d . fd) (map S6e . fe) (map S6f . ff)

s7
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> S7 a b c d e f g
  -> [S7 a b c d e f g]
s7 fa fb fc fd fe ff fg
  = caseS7 (map S7a . fa) (map S7b . fb) (map S7c . fc)
   (map S7d . fd) (map S7e . fe) (map S7f . ff) (map S7g . fg)

s8
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> S8 a b c d e f g h
  -> [S8 a b c d e f g h]
s8 fa fb fc fd fe ff fg fh
  = caseS8 (map S8a . fa) (map S8b . fb) (map S8c . fc)
   (map S8d . fd) (map S8e . fe) (map S8f . ff) (map S8g . fg)
   (map S8h . fh)


s9
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> S9 a b c d e f g h i
  -> [S9 a b c d e f g h i]
s9 fa fb fc fd fe ff fg fh fi
  = caseS9 (map S9a . fa) (map S9b . fb) (map S9c . fc)
   (map S9d . fd) (map S9e . fe) (map S9f . ff) (map S9g . fg)
   (map S9h . fh) (map S9i . fi)


s10
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> (j -> [j])
  -> S10 a b c d e f g h i j
  -> [S10 a b c d e f g h i j]
s10 fa fb fc fd fe ff fg fh fi fj
  = caseS10 (map S10a . fa) (map S10b . fb) (map S10c . fc)
   (map S10d . fd) (map S10e . fe) (map S10f . ff) (map S10g . fg)
   (map S10h . fh) (map S10i . fi) (map S10j . fj)


s11
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> (j -> [j])
  -> (k -> [k])
  -> S11 a b c d e f g h i j k
  -> [S11 a b c d e f g h i j k]
s11 fa fb fc fd fe ff fg fh fi fj fk
  = caseS11 (map S11a . fa) (map S11b . fb) (map S11c . fc)
   (map S11d . fd) (map S11e . fe) (map S11f . ff) (map S11g . fg)
   (map S11h . fh) (map S11i . fi) (map S11j . fj) (map S11k . fk)


s12
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> (j -> [j])
  -> (k -> [k])
  -> (l -> [l])
  -> S12 a b c d e f g h i j k l
  -> [S12 a b c d e f g h i j k l]
s12 fa fb fc fd fe ff fg fh fi fj fk fl
  = caseS12 (map S12a . fa) (map S12b . fb) (map S12c . fc)
   (map S12d . fd) (map S12e . fe) (map S12f . ff) (map S12g . fg)
   (map S12h . fh) (map S12i . fi) (map S12j . fj) (map S12k . fk)
   (map S12l . fl)


s13
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> (j -> [j])
  -> (k -> [k])
  -> (l -> [l])
  -> (m -> [m])
  -> S13 a b c d e f g h i j k l m
  -> [S13 a b c d e f g h i j k l m]
s13 fa fb fc fd fe ff fg fh fi fj fk fl fm
  = caseS13 (map S13a . fa) (map S13b . fb) (map S13c . fc)
   (map S13d . fd) (map S13e . fe) (map S13f . ff) (map S13g . fg)
   (map S13h . fh) (map S13i . fi) (map S13j . fj) (map S13k . fk)
   (map S13l . fl) (map S13m . fm)


s14
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> (j -> [j])
  -> (k -> [k])
  -> (l -> [l])
  -> (m -> [m])
  -> (n -> [n])
  -> S14 a b c d e f g h i j k l m n
  -> [S14 a b c d e f g h i j k l m n]
s14 fa fb fc fd fe ff fg fh fi fj fk fl fm fn
  = caseS14 (map S14a . fa) (map S14b . fb) (map S14c . fc)
   (map S14d . fd) (map S14e . fe) (map S14f . ff) (map S14g . fg)
   (map S14h . fh) (map S14i . fi) (map S14j . fj) (map S14k . fk)
   (map S14l . fl) (map S14m . fm) (map S14n . fn)


s15
  :: (a -> [a])
  -> (b -> [b])
  -> (c -> [c])
  -> (d -> [d])
  -> (e -> [e])
  -> (f -> [f])
  -> (g -> [g])
  -> (h -> [h])
  -> (i -> [i])
  -> (j -> [j])
  -> (k -> [k])
  -> (l -> [l])
  -> (m -> [m])
  -> (n -> [n])
  -> (o -> [o])
  -> S15 a b c d e f g h i j k l m n o
  -> [S15 a b c d e f g h i j k l m n o]
s15 fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo
  = caseS15 (map S15a . fa) (map S15b . fb) (map S15c . fc)
   (map S15d . fd) (map S15e . fe) (map S15f . ff) (map S15g . fg)
   (map S15h . fh) (map S15i . fi) (map S15j . fj) (map S15k . fk)
   (map S15l . fl) (map S15m . fm) (map S15n . fn) (map S15o . fo)