diff --git a/Data/Fin/List.hs b/Data/Fin/List.hs
--- a/Data/Fin/List.hs
+++ b/Data/Fin/List.hs
@@ -1,5 +1,5 @@
 module Data.Fin.List (Peano, List (..),
-                      fromList, uncons, head, tail, init, last, reverse, (!!)) where
+                      fromList, uncons, head, tail, init, last, reverse, at, swap, (!!)) where
 
 import Prelude ()
 import Data.Fin.Private
diff --git a/Data/Fin/Private.hs b/Data/Fin/Private.hs
--- a/Data/Fin/Private.hs
+++ b/Data/Fin/Private.hs
@@ -2,7 +2,7 @@
 
 module Data.Fin.Private where
 
-import Prelude (Functor (..), Show (..), Num (..), Enum (..), Bounded (..), Integral (..), Bool (..), Integer, ($), (&&), fst, snd, error)
+import Prelude (Functor (..), Show (..), Num (..), Enum (..), Bounded (..), Integral (..), Bool (..), Integer, ($), (&&), fst, snd, flip, uncurry, error)
 import Control.Applicative
 import Control.Arrow (Kleisli (..))
 import Control.Category
@@ -182,3 +182,13 @@
 Nil !! n = case n of
 (x:._)  !! Zero = x
 (_:.xs) !! Succ n = xs !! n
+
+at :: Functor f => Fin n -> (a -> f a) -> List n a -> f (List n a)
+at Zero f (a:.as) = (:.as) <$> f a
+at (Succ n) f (a:.as) = (a:.) <$> at n f as
+
+swap :: Fin n -> Fin n -> List n a -> List n a
+swap Zero Zero as = as
+swap (Succ m) (Succ n) (a:.as) = a:.swap m n as
+swap Zero (Succ n) (a:.as) = uncurry (:.) $ at n (flip (,) a) as
+swap (Succ m) Zero (a:.as) = uncurry (:.) $ at m (flip (,) a) as
diff --git a/Fin.cabal b/Fin.cabal
--- a/Fin.cabal
+++ b/Fin.cabal
@@ -1,5 +1,5 @@
 name:                Fin
-version:             0.2.1.0
+version:             0.2.2.0
 synopsis:            Finite totally-ordered sets
 -- description:         
 license:             BSD3
