diff --git a/COPYING b/COPYING
new file mode 100644
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,25 @@
+Copyright (c) 2012 Conal Elliott
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. The names of the authors may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/src/Data/UniformPair.hs b/src/Data/UniformPair.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/UniformPair.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
+{-# OPTIONS_GHC -Wall #-}
+
+----------------------------------------------------------------------
+-- |
+-- Module      :  Data.UniformPair
+-- Copyright   :  (c) 2013 Tabula, Inc.
+-- 
+-- Maintainer  :  conal@conal.net
+-- Stability   :  experimental
+-- 
+-- Uniform pairs. Because these pairs memoize functions (from Bool)--i.e.,
+-- they're representable functors--these instances provided are fully determined
+-- by the corresponding instances for functions, thanks to the type class
+-- morphism principle.
+----------------------------------------------------------------------
+
+module Data.UniformPair (Pair(..), fstP,sndP, firstP, secondP, compareSwap) where
+
+import Data.Monoid (Monoid(..),(<>))
+import Data.Functor ((<$>))
+import Data.Foldable (Foldable(..))
+import Data.Traversable (Traversable(..))
+import Control.Applicative (Applicative(..)) -- ,liftA2
+
+infix 1 :#
+
+-- | Uniform pairs
+data Pair a = a :# a deriving (Show, Functor, Foldable,Traversable)
+
+-- instance Traversable Pair where sequenceA (u :# v) = (:#) <$> u <*> v
+
+fstP :: Pair a -> a
+fstP (a :# _) = a
+
+sndP :: Pair a -> a
+sndP (_ :# b) = b
+
+firstP, secondP :: (a -> a) -> (Pair a -> Pair a)
+firstP  f (a :# b) = f a :# b
+secondP g (a :# b) = a :# g b
+
+-- unzipP :: Functor f => f (Pair a) -> Pair (f a)
+-- unzipP ps = (fstP <$> ps) :# (sndP <$> ps)
+-- unzipP = liftA2 (:#) (fmap fstP) (fmap sndP)
+
+instance Monoid a => Monoid (Pair a) where
+  mempty = mempty :# mempty
+  (a :# b) `mappend` (c :# d) = (a <> c) :# (b <> d)  -- exchange
+
+instance Applicative Pair where
+  pure a = a :# a
+  (f :# g) <*> (a :# b) = f a :# g b
+
+instance Monad Pair where
+  return = pure
+  m >>= f = joinP (f <$> m)
+
+joinP :: Pair (Pair a) -> Pair a
+joinP ((a :# _) :# (_ :# d)) = a :# d
+
+-- so
+--
+--   (a :# b) >>= f = (c :# d)
+--    where
+--      (c :# _) = f a
+--      (_ :# d) = f b
+
+-- Compare and swap
+compareSwap :: Ord a => Pair a -> Pair a
+compareSwap (a :# b) | a <= b    = a :# b
+                     | otherwise = b :# a
diff --git a/uniform-pair.cabal b/uniform-pair.cabal
new file mode 100644
--- /dev/null
+++ b/uniform-pair.cabal
@@ -0,0 +1,26 @@
+Name:                uniform-pair
+Version:             0.1.1
+Cabal-Version:       >= 1.6
+Synopsis:            Uniform pairs with class instances
+Category:            Data
+Description:
+  Uniform pairs with class instances
+Author:              Conal Elliott
+Maintainer:          conal@conal.net
+Copyright:           (c) 2013 by Conal Elliott
+License:             BSD3
+License-File:        COPYING
+Stability:           experimental
+build-type:          Simple
+
+source-repository head
+  type:     git
+  location: git://github.com/conal/uniform-pair.git
+
+Library
+  hs-Source-Dirs:      src
+  Extensions:
+  Build-Depends:       base<5
+  Exposed-Modules:     
+                       Data.UniformPair
+  ghc-options:         -Wall
