packages feed

mockcat-0.1.0.0: src/Test/MockCat/ParamDivider.hs

{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}

module Test.MockCat.ParamDivider (ParamDivider, args, return, returnValue) where

import Test.MockCat.Cons
import Test.MockCat.Param
import Prelude hiding (return)

class ParamDivider params args return | params -> args, params -> return where
  args :: params -> args
  return :: params -> return

instance ParamDivider 
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param g :> Param h :> Param i :> Param r)
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param g :> Param h :> Param i) (Param r) where
  args (a :> b :> c :> d :> e :> f :> g :> h :> i :> _) = a :> b :> c :> d :> e :> f :> g :> h :> i
  return (_ :> _ :> _ :> _ :> _ :> _ :> _ :> _ :> _ :> r) = r

instance ParamDivider 
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param g :> Param h :> Param r)
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param g :> Param h) (Param r) where
  args (a :> b :> c :> d :> e :> f :> g :> h :> _) = a :> b :> c :> d :> e :> f :> g :> h
  return (_ :> _ :> _ :> _ :> _ :> _ :> _ :> _ :> r) = r

instance ParamDivider 
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param g :> Param r)
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param g) (Param r) where
  args (a :> b :> c :> d :> e :> f :> g :> _) = a :> b :> c :> d :> e :> f :> g
  return (_ :> _ :> _ :> _ :> _ :> _ :> _ :> r) = r

instance ParamDivider 
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f :> Param r)
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param f) (Param r) where
  args (a :> b :> c :> d :> e :> f :> _) = a :> b :> c :> d :> e :> f
  return (_ :> _ :> _ :> _ :> _ :> _ :> r) = r

instance ParamDivider 
  (Param a :> Param b :> Param c :> Param d :> Param e :> Param r)
  (Param a :> Param b :> Param c :> Param d :> Param e) (Param r) where
  args (a :> b :> c :> d :> e :> _) = a :> b :> c :> d :> e
  return (_ :> _ :> _ :> _ :> _ :> r) = r

instance ParamDivider (Param a :> Param b :> Param c :> Param d :> Param r) (Param a :> Param b :> Param c :> Param d) (Param r) where
  args (a :> b :> c :> d :> _) = a :> b :> c :> d
  return (_ :> _ :> _ :> _ :> r) = r

instance ParamDivider (Param a :> Param b :> Param c :> Param r) (Param a :> Param b :> Param c) (Param r) where
  args (a :> b :> c :> _) = a :> b :> c
  return (_ :> _ :> _ :> r) = r

instance ParamDivider (Param a :> Param b :> Param r) (Param a :> Param b) (Param r) where
  args (a :> b :> _) = a :> b
  return (_ :> _ :> r) = r

instance ParamDivider (Param a :> Param r) (Param a) (Param r) where
  args (a :> _) = a
  return (_ :> r) = r

returnValue :: ParamDivider params args (Param r) => params -> r
returnValue = value . return