diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright © 2011 Nathaniel Soares
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Limit.cabal b/Limit.cabal
new file mode 100644
--- /dev/null
+++ b/Limit.cabal
@@ -0,0 +1,25 @@
+Name:          Limit
+Version:       1.0
+License:       MIT
+License-file:  LICENSE
+Category:      Data
+Synopsis:      Wrapper for data that can be unbounded
+Description:   Limit n is like Maybe n, with (Bounded n) in place of (Just n)
+               and Unbounded in place of Nothing. The only difference is that
+               ∀n. Unbounded >= Bounded n, which makes Limit a good data type
+               to deal with numbers that can become unbounded.
+Author:        Nate Soares
+Maintainer:    nate@natesoares.com
+Build-Type:    Simple
+Cabal-Version: >=1.6
+
+source-repository head
+    type: git
+    location: git://github.com/Soares/Bound.hs.git
+
+Library
+    Hs-Source-Dirs:   src
+    Build-Depends:    base >= 4 && < 5
+    Exposed-modules:  Data.Limit
+    Ghc-Options:      -Wall
+    Ghc-Prof-Options: -auto-all
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/src/Data/Limit.hs b/src/Data/Limit.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Limit.hs
@@ -0,0 +1,44 @@
+module Data.Limit
+    ( Limit(Bounded,Unbounded)
+    , isBounded
+    , isUnbounded
+    , fromBounded
+    , fromLimit
+    ) where
+
+import Control.Monad ( liftM2 )
+
+data Limit a = Bounded a | Unbounded
+    deriving (Eq, Read, Show)
+
+instance Ord a => Ord (Limit a) where
+    x <= y = fromLimit (y == Unbounded) (liftM2 (<=) x y)
+
+instance Functor Limit where
+    fmap _ Unbounded = Unbounded
+    fmap f (Bounded a) = Bounded (f a)
+
+instance Monad Limit where
+    Unbounded >>= _ = Unbounded
+    (Bounded x) >>= k = k x
+
+    Unbounded >> _ = Unbounded
+    (Bounded _) >> k = k
+
+    return = Bounded
+    fail _ = Unbounded
+
+isBounded :: Limit a -> Bool
+isBounded Unbounded = False
+isBounded _ = True
+
+isUnbounded :: Limit a -> Bool
+isUnbounded = not . isBounded
+
+fromBounded :: Limit a -> a
+fromBounded Unbounded = error "Limit.fromBounded: Unbounded" -- YOUR BAD
+fromBounded (Bounded x) = x
+
+fromLimit :: a -> Limit a -> a
+fromLimit d Unbounded = d
+fromLimit _ (Bounded x) = x
