module Data.Function ((.), const, id, flip, ($), applyTo, fix, on, result, result2, result3, result4, ignoreArg, ignoreArg2, ignoreArg3, ignoreArg4, ignoreArg5) where

import Control.Category

const :: a -> b -> a
const x _ = x

flip :: (a -> b -> c) -> (b -> a -> c)
flip f x y = f y x

infixl 0 $
($) :: (a -> b) -> a -> b
f $ x = f x

applyTo :: a -> (a -> b) -> b
applyTo = flip ($)

fix :: (a -> a) -> a
fix f = let x = f x in x

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
(.*.) `on` f = \x y -> f x .*. f y


ignoreArg :: Category (~>) => b ~> c  ->  a ~> b  ->  a ~> c
ignoreArg = result

ignoreArg2 :: ((a -> c) -> (d -> e)) -> (a -> b -> c) -> (d -> b -> e)
ignoreArg2 f = flip . ignoreArg f . flip

ignoreArg3 :: ((a -> b -> d) -> (e -> f -> g)) -> (a -> b -> c -> d) -> (e -> f -> c -> g)
ignoreArg3 f = result flip . ignoreArg2 f . result flip

ignoreArg4 :: ((a -> b -> c -> e) -> (f -> g -> h -> i)) -> (a -> b -> c -> d -> e) -> (f -> g -> h -> d -> i)
ignoreArg4 f = result2 flip . ignoreArg3 f . result2 flip

ignoreArg5 :: ((a -> b -> c -> d -> f) -> (g -> h -> i -> j -> k)) -> (a -> b -> c -> d -> e -> f) -> (g -> h -> i -> j -> e -> k)
ignoreArg5 f = result3 flip . ignoreArg4 f . result3 flip
