diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,7 @@
 # Revision history for intcode
 
+## 0.2.0.0
+* Rename 'intCodeToList' to 'intcodeToList'
+
 ## 0.1.0.0
 * Initial release
diff --git a/intcode.cabal b/intcode.cabal
--- a/intcode.cabal
+++ b/intcode.cabal
@@ -1,7 +1,7 @@
 cabal-version:       2.4
 
 name:                intcode
-version:             0.1.0.0
+version:             0.2.0.0
 synopsis:            Advent of Code 2019 intcode interpreter
 category:            Compilers/Interpreters
 license:             ISC
@@ -10,6 +10,8 @@
 maintainer:          emertens@gmail.com
 copyright:           2019 Eric Mertens
 build-type:          Simple
+homepage:            https://github.com/glguy/intcode
+bug-reports:         https://github.com/glguy/intcode/issues
 tested-with:         GHC ==8.6.5, GHC ==8.8.1
 
 description:
@@ -23,6 +25,10 @@
 extra-source-files:
   CHANGELOG.md
   README.md
+
+source-repository head
+  type:              git
+  location:          https://github.com/glguy/intcode
 
 library
   hs-source-dirs:    src
diff --git a/src/Intcode.hs b/src/Intcode.hs
--- a/src/Intcode.hs
+++ b/src/Intcode.hs
@@ -18,18 +18,18 @@
   1. Parse input text file into a list of numbers
   2. Execute op codes to single-step input/output effects.
   3. Execute single-stop effects into big-step effects.
-  4. Optional: Evaluate the effect as a function from a list of inputs to list of outputs
 
 Common use modes:
 
-* List functions: 'intCodeToList'
-* Effect interpretation: 'new', 'run', 'Effect'
+* List functions: 'intcodeToList'
+* Individual machine step processing: 'Step', 'new', 'step'
+* Input/output interpretation: 'Effect', 'new', 'run'
 
 -}
 module Intcode
   (
   -- * Simple interface
-  intCodeToList,
+  intcodeToList,
   runIO,
 
   -- * Machine state
@@ -60,7 +60,8 @@
 -- ASCII I/O
 ------------------------------------------------------------------------
 
--- | Run intcode program using stdio.
+-- | Run intcode program using stdio. Non-ASCII outputs are printed as
+-- integers.
 --
 -- >>> runIO (run (new [104,72,104,101,104,108,104,108,104,111,104,33,104,10,99]))
 -- Hello!
@@ -83,25 +84,25 @@
 -- Throws: 'IntcodeFault' when machine faults or too few inputs are provided.
 --
 --
--- >>> intCodeToList [3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9] <$> [[0],[10]]
+-- >>> intcodeToList [3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9] <$> [[0],[10]]
 -- [[0],[1]]
 --
--- >>> intCodeToList [3,3,1105,-1,9,1101,0,0,12,4,12,99,1] <$> [[0],[10]]
+-- >>> intcodeToList [3,3,1105,-1,9,1101,0,0,12,4,12,99,1] <$> [[0],[10]]
 -- [[0],[1]]
 --
 -- >>> :{
--- >>> intCodeToList
+-- >>> intcodeToList
 -- >>>   [3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,
 -- >>>    1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,
 -- >>>    999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99]
 -- >>> <$> [[7],[8],[9]]
 -- >>> :}
 -- [[999],[1000],[1001]]
-intCodeToList ::
+intcodeToList ::
   [Int] {- ^ initial memory -} ->
   [Int] {- ^ inputs         -} ->
   [Int] {- ^ outputs        -}
-intCodeToList = effectList . run . new
+intcodeToList = effectList . run . new
 
 -- | Evaluate a program's effect as a function from a list of
 -- inputs to a list of outputs.
@@ -133,7 +134,10 @@
   deriving (Eq, Ord, Show)
 
 -- | Value stored in initial memory image at given index.
-indexImage :: Machine -> Int -> Int
+indexImage ::
+  Machine {- ^ machine  -} ->
+  Int     {- ^ position -} ->
+  Int     {- ^ value    -}
 indexImage m i
   | a `seq` True, 0 <= i, i < P.sizeofPrimArray a = P.indexPrimArray a i
   | otherwise                                     = 0
@@ -207,7 +211,9 @@
   | Fault                 -- ^ Execution failure
   deriving Show
 
--- | Big-step semantics of virtual machine.
+-- | Big-step semantics of virtual machine. The implementation details
+-- of 'Machine' are abstracted away and the program behavior can be
+-- observed by interpreting the various 'Effect' constructors.
 --
 -- >>> run (new [1102,34915192,34915192,7,4,7,99,0])
 -- Output 1219070632396864 Halt
@@ -252,7 +258,7 @@
 followedBy (Output o x) y = Output o (followedBy x y)
 followedBy (Input  f  ) y = Input (\i -> followedBy (f i) y)
 
--- | Provide an input to the first occurence of an input request
+-- | Provide an input to the first occurrence of an input request
 -- in a program effect. It is considered a fault if a program
 -- terminates before using the input.
 --
@@ -281,35 +287,38 @@
 -- | Small-step semantics of virtual machine.
 step :: Machine -> Step
 step mach =
-  case populateParams <$> decode (at (pc mach)) of
+  case populateParams <$> decode (mach ! pc mach) of
     Nothing            -> StepFault
-    Just (pc', opcode) -> impl opcode $! jmp pc' mach
+    Just (pc', opcode) -> opcodeImpl opcode $! jmp pc' mach
 
   where
     populateParams :: Opcode Mode -> (Int, Opcode Int)
     populateParams = mapWithIndex toPtr (pc mach + 1)
 
-    at :: Int -> Int
-    at i = mach ! i
-
     toPtr :: Int -> Mode -> Int
-    toPtr i Imm =    i
-    toPtr i Abs = at i
-    toPtr i Rel = at i + relBase mach
+    toPtr i Imm =        i
+    toPtr i Abs = mach ! i
+    toPtr i Rel = mach ! i + relBase mach
 
-    impl :: Opcode Int -> Machine -> Step
-    impl opcode =
-      case opcode of
-        Add a b c -> Step . set c (at a + at b)
-        Mul a b c -> Step . set c (at a * at b)
-        Inp a     -> StepIn . flip (set a)
-        Out a     -> StepOut (at a)
-        Jnz a b   -> Step . if at a /= 0 then jmp (at b) else id
-        Jz  a b   -> Step . if at a == 0 then jmp (at b) else id
-        Lt  a b c -> Step . set c (if at a <  at b then 1 else 0)
-        Eq  a b c -> Step . set c (if at a == at b then 1 else 0)
-        Arb a     -> Step . adjustRelBase (at a)
-        Hlt       -> const StepHalt
+-- | Apply a decoded opcode to the machine state.
+opcodeImpl ::
+  Opcode Int {- ^ opcode with pointers    -} ->
+  Machine    {- ^ machine with PC updated -} ->
+  Step
+opcodeImpl o m =
+  case o of
+    Add a b c -> Step    (set c (at a + at b) m)
+    Mul a b c -> Step    (set c (at a * at b) m)
+    Inp a     -> StepIn  (\i -> set a i m)
+    Out a     -> StepOut (at a) m
+    Jnz a b   -> Step    (if at a /= 0 then jmp (at b) m else m)
+    Jz  a b   -> Step    (if at a == 0 then jmp (at b) m else m)
+    Lt  a b c -> Step    (set c (if at a <  at b then 1 else 0) m)
+    Eq  a b c -> Step    (set c (if at a == at b then 1 else 0) m)
+    Arb a     -> Step    (adjustRelBase (at a) m)
+    Hlt       -> StepHalt
+  where
+    at i = m ! i
 
 mapWithIndex :: (Int -> a -> b) -> Int -> Opcode a -> (Int, Opcode b)
 mapWithIndex f = mapAccumL (\i a -> (i+1, f i a))
@@ -362,7 +371,10 @@
     fill = traverse (parameter n)
 
 -- | Compute the parameter mode for an argument at a given position.
-parameter :: Int {- ^ opcode -} -> Int {- ^ position -} -> Maybe Mode
+parameter ::
+  Int {- ^ opcode   -} ->
+  Int {- ^ position -} ->
+  Maybe Mode
 parameter n i =
   case digit (i+1) n of
     0 -> Just Abs
@@ -401,7 +413,7 @@
 -- Exceptions
 ------------------------------------------------------------------------
 
--- | Error when a machine fails to step.
+-- | Error when a machine fails to decode an instruction.
 data IntcodeFault = IntcodeFault
   deriving (Eq, Ord, Show, Read)
 
