diff --git a/machines.cabal b/machines.cabal
--- a/machines.cabal
+++ b/machines.cabal
@@ -1,6 +1,6 @@
 name:          machines
 category:      Control, Enumerator
-version:       0.1
+version:       0.1.1
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -45,6 +45,7 @@
     Data.Machine.Moore
     Data.Machine.Process
     Data.Machine.Plan
+    Data.Machine.Source
     Data.Machine.Tee
     Data.Machine.Type
     Data.Machine.Unread
diff --git a/src/Data/Machine/Source.hs b/src/Data/Machine/Source.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Machine/Source.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE Rank2Types #-}
+{-# LANGUAGE FlexibleInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Data.Machine.Source
+-- Copyright   :  (C) 2012 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  provisional
+-- Portability :  Rank-2 Types
+--
+----------------------------------------------------------------------------
+module Data.Machine.Source
+  (
+  -- * Sources
+    Source, SourceT
+  , source
+  , repeated
+  , cycled
+  , cap
+  ) where
+
+import Control.Category
+import Data.Foldable
+import Data.Machine.Plan
+import Data.Machine.Type
+import Data.Machine.Process
+import Prelude hiding ((.),id)
+
+-------------------------------------------------------------------------------
+-- Source
+-------------------------------------------------------------------------------
+
+-- | A 'Source' never reads from its inputs.
+type Source b = forall k a. Machine k a b
+
+-- | A 'SourceT' never reads from its inputs, but may have monadic side-effects.
+type SourceT m b = forall k a. MachineT m k a b
+
+-- | Repeat the same value, over and over.
+repeated :: o -> Source o
+repeated = repeatedly . yield
+
+-- | Loop through a 'Foldable' container over and over.
+cycled :: Foldable f => f b -> Source b
+cycled xs = repeatedly (traverse_ yield xs)
+
+-- | Generate a 'Source' from any 'Foldable' container.
+source :: Foldable f => f b -> Source b
+source xs = construct (traverse_ yield xs)
+
+-- |
+-- You can transform a 'Source' with a 'Process'.
+--
+-- Alternately you can view this as capping the 'Source' end of a 'Process',
+-- yielding a new 'Source'.
+--
+-- @'cap' = 'pipe'@
+--
+cap :: Process a b -> Source a -> Source b
+cap l r = after r l
