-- |
-- Module      : Flippers
-- Copyright   : (c) Christian Marie 2014
-- License     : BSD3
--
-- Maintainer  : christian@ponies.io
-- Stability   : experimental
-- Portability : portable
--
-- This module provides functions to rearrange arguments, such as rotate4 and
-- flip4. Compose them to achive whatever ordering you like.
--
module Data.Function.Flippers
(
    -- * Rotation
    -- | Rotate all arguments right one position
    rotate1,
    rotate2,
    rotate3,
    rotate4,
    rotate5,
    rotate6,
    rotate7,
    rotate8,
    rotate9,
    -- * Flipping
    -- | Reverse the order of all arguments
    flip1,
    flip2,
    flip3,
    flip4,
    flip5,
    flip6,
    flip7,
    flip8,
    flip9,
) where

-- | Does nothing, 'id'
rotate1 :: (a -> b) -> (a -> b)
rotate1 :: forall a b. (a -> b) -> a -> b
rotate1 = (a -> b) -> a -> b
forall a. a -> a
id

-- | Does nothing, 'id'
flip1 :: (a -> b) -> (a -> b)
flip1 :: forall a b. (a -> b) -> a -> b
flip1 = (a -> b) -> a -> b
forall a. a -> a
id

-- | Move the second argument to the first place
rotate2 :: (a -> b -> c) -> (b -> a -> c)
rotate2 :: forall a b c. (a -> b -> c) -> b -> a -> c
rotate2 = (a -> b -> c) -> b -> a -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip

-- | Reverse both arguments, same as 'rotate2'
flip2 :: (a -> b -> c) -> (b -> a -> c)
flip2 :: forall a b c. (a -> b -> c) -> b -> a -> c
flip2 = (a -> b -> c) -> b -> a -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip

-- | Move the third argument to the first place
rotate3 :: (a -> b -> c -> d) -> (c -> a -> b -> d)
rotate3 :: forall a b c d. (a -> b -> c -> d) -> c -> a -> b -> d
rotate3 = (a -> c -> b -> d) -> c -> a -> b -> d
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> c -> b -> d) -> c -> a -> b -> d)
-> ((a -> b -> c -> d) -> a -> c -> b -> d)
-> (a -> b -> c -> d)
-> c
-> a
-> b
-> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d) -> c -> b -> d
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((b -> c -> d) -> c -> b -> d)
-> (a -> b -> c -> d) -> a -> c -> b -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse three arguments
flip3 :: (a -> b -> c -> d) -> (c -> b -> a -> d)
flip3 :: forall a b c d. (a -> b -> c -> d) -> c -> b -> a -> d
flip3 = (b -> a -> c -> d) -> c -> b -> a -> d
forall a b c d. (a -> b -> c -> d) -> c -> a -> b -> d
rotate3 ((b -> a -> c -> d) -> c -> b -> a -> d)
-> ((a -> b -> c -> d) -> b -> a -> c -> d)
-> (a -> b -> c -> d)
-> c
-> b
-> a
-> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d) -> b -> a -> c -> d
forall a b c. (a -> b -> c) -> b -> a -> c
flip2

-- | Move the fourth argument to the first place
rotate4 :: (a -> b -> c -> d -> e) -> (d -> a -> b -> c -> e)
rotate4 :: forall a b c d e. (a -> b -> c -> d -> e) -> d -> a -> b -> c -> e
rotate4 = (a -> d -> b -> c -> e) -> d -> a -> b -> c -> e
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> d -> b -> c -> e) -> d -> a -> b -> c -> e)
-> ((a -> b -> c -> d -> e) -> a -> d -> b -> c -> e)
-> (a -> b -> c -> d -> e)
-> d
-> a
-> b
-> c
-> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d -> e) -> d -> b -> c -> e
forall a b c d. (a -> b -> c -> d) -> c -> a -> b -> d
rotate3 ((b -> c -> d -> e) -> d -> b -> c -> e)
-> (a -> b -> c -> d -> e) -> a -> d -> b -> c -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse four arguments
flip4 :: (a -> b -> c -> d -> e) -> (d -> c -> b -> a -> e)
flip4 :: forall a b c d e. (a -> b -> c -> d -> e) -> d -> c -> b -> a -> e
flip4 = (c -> b -> a -> d -> e) -> d -> c -> b -> a -> e
forall a b c d e. (a -> b -> c -> d -> e) -> d -> a -> b -> c -> e
rotate4 ((c -> b -> a -> d -> e) -> d -> c -> b -> a -> e)
-> ((a -> b -> c -> d -> e) -> c -> b -> a -> d -> e)
-> (a -> b -> c -> d -> e)
-> d
-> c
-> b
-> a
-> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d -> e) -> c -> b -> a -> d -> e
forall a b c d. (a -> b -> c -> d) -> c -> b -> a -> d
flip3

-- | Move the fifth argument to the first place
rotate5 :: (a -> b -> c -> d -> e -> f) -> (e -> a -> b -> c -> d -> f)
rotate5 :: forall a b c d e f.
(a -> b -> c -> d -> e -> f) -> e -> a -> b -> c -> d -> f
rotate5 = (a -> e -> b -> c -> d -> f) -> e -> a -> b -> c -> d -> f
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> e -> b -> c -> d -> f) -> e -> a -> b -> c -> d -> f)
-> ((a -> b -> c -> d -> e -> f) -> a -> e -> b -> c -> d -> f)
-> (a -> b -> c -> d -> e -> f)
-> e
-> a
-> b
-> c
-> d
-> f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d -> e -> f) -> e -> b -> c -> d -> f
forall a b c d e. (a -> b -> c -> d -> e) -> d -> a -> b -> c -> e
rotate4 ((b -> c -> d -> e -> f) -> e -> b -> c -> d -> f)
-> (a -> b -> c -> d -> e -> f) -> a -> e -> b -> c -> d -> f
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse five arguments
flip5 :: (a -> b -> c -> d -> e -> f) -> (e -> d -> c -> b -> a -> f)
flip5 :: forall a b c d e f.
(a -> b -> c -> d -> e -> f) -> e -> d -> c -> b -> a -> f
flip5 = (d -> c -> b -> a -> e -> f) -> e -> d -> c -> b -> a -> f
forall a b c d e f.
(a -> b -> c -> d -> e -> f) -> e -> a -> b -> c -> d -> f
rotate5 ((d -> c -> b -> a -> e -> f) -> e -> d -> c -> b -> a -> f)
-> ((a -> b -> c -> d -> e -> f) -> d -> c -> b -> a -> e -> f)
-> (a -> b -> c -> d -> e -> f)
-> e
-> d
-> c
-> b
-> a
-> f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d -> e -> f) -> d -> c -> b -> a -> e -> f
forall a b c d e. (a -> b -> c -> d -> e) -> d -> c -> b -> a -> e
flip4

-- | Move the sixth argument to the first place
rotate6 :: (a -> b -> c -> d -> e -> f -> g) ->
         (f -> a -> b -> c -> d -> e -> g)
rotate6 :: forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> f -> a -> b -> c -> d -> e -> g
rotate6 = (a -> f -> b -> c -> d -> e -> g)
-> f -> a -> b -> c -> d -> e -> g
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> f -> b -> c -> d -> e -> g)
 -> f -> a -> b -> c -> d -> e -> g)
-> ((a -> b -> c -> d -> e -> f -> g)
    -> a -> f -> b -> c -> d -> e -> g)
-> (a -> b -> c -> d -> e -> f -> g)
-> f
-> a
-> b
-> c
-> d
-> e
-> g
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d -> e -> f -> g) -> f -> b -> c -> d -> e -> g
forall a b c d e f.
(a -> b -> c -> d -> e -> f) -> e -> a -> b -> c -> d -> f
rotate5 ((b -> c -> d -> e -> f -> g) -> f -> b -> c -> d -> e -> g)
-> (a -> b -> c -> d -> e -> f -> g)
-> a
-> f
-> b
-> c
-> d
-> e
-> g
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse six arguments
flip6 :: (a -> b -> c -> d -> e -> f -> g) ->
           (f -> e -> d -> c -> b -> a -> g)
flip6 :: forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> f -> e -> d -> c -> b -> a -> g
flip6 = (e -> d -> c -> b -> a -> f -> g)
-> f -> e -> d -> c -> b -> a -> g
forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> f -> a -> b -> c -> d -> e -> g
rotate6 ((e -> d -> c -> b -> a -> f -> g)
 -> f -> e -> d -> c -> b -> a -> g)
-> ((a -> b -> c -> d -> e -> f -> g)
    -> e -> d -> c -> b -> a -> f -> g)
-> (a -> b -> c -> d -> e -> f -> g)
-> f
-> e
-> d
-> c
-> b
-> a
-> g
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d -> e -> f -> g)
-> e -> d -> c -> b -> a -> f -> g
forall a b c d e f.
(a -> b -> c -> d -> e -> f) -> e -> d -> c -> b -> a -> f
flip5

-- | Move the seventh argument to the first place
rotate7 :: (a -> b -> c -> d -> e -> f -> g -> h) ->
         (g -> a -> b -> c -> d -> e -> f -> h)
rotate7 :: forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> g -> a -> b -> c -> d -> e -> f -> h
rotate7 = (a -> g -> b -> c -> d -> e -> f -> h)
-> g -> a -> b -> c -> d -> e -> f -> h
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> g -> b -> c -> d -> e -> f -> h)
 -> g -> a -> b -> c -> d -> e -> f -> h)
-> ((a -> b -> c -> d -> e -> f -> g -> h)
    -> a -> g -> b -> c -> d -> e -> f -> h)
-> (a -> b -> c -> d -> e -> f -> g -> h)
-> g
-> a
-> b
-> c
-> d
-> e
-> f
-> h
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d -> e -> f -> g -> h)
-> g -> b -> c -> d -> e -> f -> h
forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> f -> a -> b -> c -> d -> e -> g
rotate6 ((b -> c -> d -> e -> f -> g -> h)
 -> g -> b -> c -> d -> e -> f -> h)
-> (a -> b -> c -> d -> e -> f -> g -> h)
-> a
-> g
-> b
-> c
-> d
-> e
-> f
-> h
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse seven arguments
flip7 :: (a -> b -> c -> d -> e -> f -> g -> h) ->
           (g -> f -> e -> d -> c -> b -> a -> h)
flip7 :: forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> g -> f -> e -> d -> c -> b -> a -> h
flip7 = (f -> e -> d -> c -> b -> a -> g -> h)
-> g -> f -> e -> d -> c -> b -> a -> h
forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> g -> a -> b -> c -> d -> e -> f -> h
rotate7 ((f -> e -> d -> c -> b -> a -> g -> h)
 -> g -> f -> e -> d -> c -> b -> a -> h)
-> ((a -> b -> c -> d -> e -> f -> g -> h)
    -> f -> e -> d -> c -> b -> a -> g -> h)
-> (a -> b -> c -> d -> e -> f -> g -> h)
-> g
-> f
-> e
-> d
-> c
-> b
-> a
-> h
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d -> e -> f -> g -> h)
-> f -> e -> d -> c -> b -> a -> g -> h
forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> f -> e -> d -> c -> b -> a -> g
flip6

-- | Move the eight argument to the first place
rotate8 :: (a -> b -> c -> d -> e -> f -> g -> h -> i) ->
         (h -> a -> b -> c -> d -> e -> f -> g -> i)
rotate8 :: forall a b c d e f g h i.
(a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h -> a -> b -> c -> d -> e -> f -> g -> i
rotate8 = (a -> h -> b -> c -> d -> e -> f -> g -> i)
-> h -> a -> b -> c -> d -> e -> f -> g -> i
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> h -> b -> c -> d -> e -> f -> g -> i)
 -> h -> a -> b -> c -> d -> e -> f -> g -> i)
-> ((a -> b -> c -> d -> e -> f -> g -> h -> i)
    -> a -> h -> b -> c -> d -> e -> f -> g -> i)
-> (a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h
-> a
-> b
-> c
-> d
-> e
-> f
-> g
-> i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d -> e -> f -> g -> h -> i)
-> h -> b -> c -> d -> e -> f -> g -> i
forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> g -> a -> b -> c -> d -> e -> f -> h
rotate7 ((b -> c -> d -> e -> f -> g -> h -> i)
 -> h -> b -> c -> d -> e -> f -> g -> i)
-> (a -> b -> c -> d -> e -> f -> g -> h -> i)
-> a
-> h
-> b
-> c
-> d
-> e
-> f
-> g
-> i
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse eight arguments
flip8 :: (a -> b -> c -> d -> e -> f -> g -> h -> i) ->
           (h -> g -> f -> e -> d -> c -> b -> a -> i)
flip8 :: forall a b c d e f g h i.
(a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h -> g -> f -> e -> d -> c -> b -> a -> i
flip8 = (g -> f -> e -> d -> c -> b -> a -> h -> i)
-> h -> g -> f -> e -> d -> c -> b -> a -> i
forall a b c d e f g h i.
(a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h -> a -> b -> c -> d -> e -> f -> g -> i
rotate8 ((g -> f -> e -> d -> c -> b -> a -> h -> i)
 -> h -> g -> f -> e -> d -> c -> b -> a -> i)
-> ((a -> b -> c -> d -> e -> f -> g -> h -> i)
    -> g -> f -> e -> d -> c -> b -> a -> h -> i)
-> (a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h
-> g
-> f
-> e
-> d
-> c
-> b
-> a
-> i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d -> e -> f -> g -> h -> i)
-> g -> f -> e -> d -> c -> b -> a -> h -> i
forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> g -> f -> e -> d -> c -> b -> a -> h
flip7

-- | Move the ninth argument to the first place
rotate9 :: (a -> b -> c -> d -> e -> f -> g -> h -> i -> j) ->
         (i -> a -> b -> c -> d -> e -> f -> g -> h -> j)
rotate9 :: forall a b c d e f g h i j.
(a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> i -> a -> b -> c -> d -> e -> f -> g -> h -> j
rotate9 = (a -> i -> b -> c -> d -> e -> f -> g -> h -> j)
-> i -> a -> b -> c -> d -> e -> f -> g -> h -> j
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> i -> b -> c -> d -> e -> f -> g -> h -> j)
 -> i -> a -> b -> c -> d -> e -> f -> g -> h -> j)
-> ((a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
    -> a -> i -> b -> c -> d -> e -> f -> g -> h -> j)
-> (a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> i
-> a
-> b
-> c
-> d
-> e
-> f
-> g
-> h
-> j
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b -> c -> d -> e -> f -> g -> h -> i -> j)
-> i -> b -> c -> d -> e -> f -> g -> h -> j
forall a b c d e f g h i.
(a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h -> a -> b -> c -> d -> e -> f -> g -> i
rotate8 ((b -> c -> d -> e -> f -> g -> h -> i -> j)
 -> i -> b -> c -> d -> e -> f -> g -> h -> j)
-> (a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> a
-> i
-> b
-> c
-> d
-> e
-> f
-> g
-> h
-> j
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)

-- | Reverse nine arguments
flip9 :: (a -> b -> c -> d -> e -> f -> g -> h -> i -> j) ->
           (i -> h -> g -> f -> e -> d -> c -> b -> a -> j)
flip9 :: forall a b c d e f g h i j.
(a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> i -> h -> g -> f -> e -> d -> c -> b -> a -> j
flip9 = (h -> g -> f -> e -> d -> c -> b -> a -> i -> j)
-> i -> h -> g -> f -> e -> d -> c -> b -> a -> j
forall a b c d e f g h i j.
(a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> i -> a -> b -> c -> d -> e -> f -> g -> h -> j
rotate9 ((h -> g -> f -> e -> d -> c -> b -> a -> i -> j)
 -> i -> h -> g -> f -> e -> d -> c -> b -> a -> j)
-> ((a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
    -> h -> g -> f -> e -> d -> c -> b -> a -> i -> j)
-> (a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> i
-> h
-> g
-> f
-> e
-> d
-> c
-> b
-> a
-> j
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> c -> d -> e -> f -> g -> h -> i -> j)
-> h -> g -> f -> e -> d -> c -> b -> a -> i -> j
forall a b c d e f g h i.
(a -> b -> c -> d -> e -> f -> g -> h -> i)
-> h -> g -> f -> e -> d -> c -> b -> a -> i
flip8