module Permutations

-- | All permutations of a list.
permutations : List a -> List (List a)
permutations [] = [[]]
permutations xs = [y :: zs | (y, ys) <- select xs, zs <- permutations ys]
  where
    select : List a -> List (a, List a)
    select []        = []
    select (x :: xs) = (x, xs) :: [(y, x::ys) | (y,ys) <- select xs]