module ADP.Fusion.Core.Apply where
import Data.PrimitiveArray (Z(..), (:.)(..))
class Apply x where
type Fun x :: *
apply :: Fun x -> x
instance Apply (Z:.a -> res) where
type Fun (Z:.a -> res) = a -> res
apply fun (Z:.a) = fun a
instance Apply (Z:.a:.b -> res) where
type Fun (Z:.a:.b -> res) = a->b -> res
apply fun (Z:.a:.b) = fun a b
instance Apply (Z:.a:.b:.c -> res) where
type Fun (Z:.a:.b:.c -> res) = a->b->c -> res
apply fun (Z:.a:.b:.c) = fun a b c
instance Apply (Z:.a:.b:.c:.d -> res) where
type Fun (Z:.a:.b:.c:.d -> res) = a->b->c->d -> res
apply fun (Z:.a:.b:.c:.d) = fun a b c d
instance Apply (Z:.a:.b:.c:.d:.e -> res) where
type Fun (Z:.a:.b:.c:.d:.e -> res) = a->b->c->d->e -> res
apply fun (Z:.a:.b:.c:.d:.e) = fun a b c d e
instance Apply (Z:.a:.b:.c:.d:.e:.f -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f -> res) = a->b->c->d->e->f -> res
apply fun (Z:.a:.b:.c:.d:.e:.f) = fun a b c d e f
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g -> res) = a->b->c->d->e->f->g -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g) = fun a b c d e f g
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h -> res) = a->b->c->d->e->f->g->h -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h) = fun a b c d e f g h
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i -> res) = a->b->c->d->e->f->g->h->i -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i) = fun a b c d e f g h i
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j -> res) = a->b->c->d->e->f->g->h->i->j -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j) = fun a b c d e f g h i j
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k -> res) = a->b->c->d->e->f->g->h->i->j->k -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k) = fun a b c d e f g h i j k
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l -> res) = a->b->c->d->e->f->g->h->i->j->k->l -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l) = fun a b c d e f g h i j k l
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m -> res) = a->b->c->d->e->f->g->h->i->j->k->l->m -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m) = fun a b c d e f g h i j k l m
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n -> res) = a->b->c->d->e->f->g->h->i->j->k->l->m->n -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n) = fun a b c d e f g h i j k l m n
instance Apply (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n:.o -> res) where
type Fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n:.o -> res) = a->b->c->d->e->f->g->h->i->j->k->l->m->n->o -> res
apply fun (Z:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n:.o) = fun a b c d e f g h i j k l m n o