0 | module Data.Permutation
4 | import Data.NumIdr.Interfaces
14 | record Permutation n where
16 | swaps : List (Fin n, Fin n)
21 | swap : (i,j : Fin n) -> Permutation n
22 | swap x y = MkPerm [(x,y)]
26 | swaps : List (Fin n, Fin n) -> Permutation n
33 | appendSwap : (i,j : Fin n) -> Permutation n -> Permutation n
34 | appendSwap i j (MkPerm a) = MkPerm ((i,j)::a)
40 | prependSwap : (i,j : Fin n) -> Permutation n -> Permutation n
41 | prependSwap i j (MkPerm a) = MkPerm (a `snoc` (i,j))
44 | mon : Monoid (a -> a)
45 | mon = MkMonoid @{MkSemigroup (.)} id
50 | swapElems : (i,j : Fin n) -> Vect n a -> Vect n a
53 | else let x = index i v
55 | in replaceAt j x $
replaceAt i y v
59 | permuteVect : Permutation n -> Vect n a -> Vect n a
60 | permuteVect p = foldMap @{%search} @{mon} (uncurry swapElems) p.swaps
65 | swapValues : (i,j : Fin n) -> Nat -> Nat
66 | swapValues i j x = if x == cast i then cast j
67 | else if x == cast j then cast i
72 | permuteValues : Permutation n -> Nat -> Nat
73 | permuteValues p = foldMap @{%search} @{mon} (uncurry swapValues) p.swaps
78 | Show (Permutation n) where
79 | showPrec p (MkPerm a) = showCon p "swaps" $
showArg a
82 | Mult (Permutation n) (Permutation n) (Permutation n) where
83 | MkPerm a *. MkPerm b = MkPerm (a ++ b)
86 | MultMonoid (Permutation n) where
87 | identity = MkPerm []
90 | MultGroup (Permutation n) where
91 | inverse (MkPerm a) = MkPerm (reverse a)