diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,4 +1,4 @@
-## inchworm-1.1.1.1:
+## inchworm-1.1.1:
 
  * Matching combinators now produce the range of source locations that matched,
    instead of just the starting location.
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,13 +1,16 @@
-Copyright (c) 2016 The Inchworm Development Team
+-------------------------------------------------------------------------------
+The Inchworm License (MIT style)
 
- 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
- condition:
+Copyrite (K) 2016-2018 The Inchworm Development Team
+All rights reversed.
 
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
+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 condition:
+
+The above copyrite notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+-------------------------------------------------------------------------------
diff --git a/Readme.md b/Readme.md
--- a/Readme.md
+++ b/Readme.md
@@ -5,15 +5,15 @@
 Tokens are specified via simple fold functions, and we include
 baked in source location handling.
 
-If you want to parse expressions instead of performing lexical
-analysis then try the `parsec` or `attoparsec` packages, which
-have more general purpose combinators.
-
 Matchers for standard tokens like comments and strings 
 are in the `Text.Lexer.Inchworm.Char` module.
 
 No dependencies other than the Haskell `base` library.
 
+If you want to parse expressions instead of performing lexical
+analysis then try the `parsec` or `attoparsec` packages, which
+have more general purpose combinators.
+
 ## Minimal example
 
 The following code demonstrates how to perform lexical analysis
@@ -67,6 +67,6 @@
 main 
  = do   let fileName = "Source.lispy"
         let source   = "(some (Lispy like) 26 Program 93 (for you))"
-        toks    <- scanStringIO source (scanner fileName)
+        let toks     = scanString source (scanner fileName)
         print toks
 ```
diff --git a/Text/Lexer/Inchworm.hs b/Text/Lexer/Inchworm.hs
--- a/Text/Lexer/Inchworm.hs
+++ b/Text/Lexer/Inchworm.hs
@@ -73,6 +73,7 @@
         , Scanner
 
           -- * Generic Scanning
+        , scanList
         , scanListIO
 
           -- ** Source Construction
@@ -101,6 +102,7 @@
 import Text.Lexer.Inchworm.Source
 import Text.Lexer.Inchworm.Scanner
 import Text.Lexer.Inchworm.Combinator
+import System.IO.Unsafe
 
 
 -- | Scan a list of generic input tokens in the IO monad,
@@ -108,8 +110,22 @@
 --   along with the remaining input.
 --
 --   NOTE: If you just want to scan a `String` of characters
---   use @scanStringIO@ from "Text.Lexer.Inchworm.Char"
+--   use @scanString@ from "Text.Lexer.Inchworm.Char"
 --
+scanList 
+        :: Eq i
+        => loc                   -- ^ Starting source location.
+        -> (i -> loc -> loc)     -- ^ Function to bump the current location by one input token.
+        -> [i]                   -- ^ List of input tokens.
+        -> Scanner IO loc [i] a  -- ^ Scanner to apply.
+        -> ([a], loc, [i])
+         
+scanList loc bump input scanner
+ = unsafePerformIO $ scanListIO loc bump input scanner
+
+
+ -- | Implementation for `scanList`,
+--   that uses the IO monad to manage its state.
 scanListIO 
         :: Eq i
         => loc                   -- ^ Starting source location.
@@ -121,3 +137,5 @@
 scanListIO loc bump input scanner
  = do   src     <- makeListSourceIO loc bump input
         scanSourceToList src scanner
+
+
diff --git a/Text/Lexer/Inchworm/Char.hs b/Text/Lexer/Inchworm/Char.hs
--- a/Text/Lexer/Inchworm/Char.hs
+++ b/Text/Lexer/Inchworm/Char.hs
@@ -4,6 +4,7 @@
         ( module Text.Lexer.Inchworm
 
           -- * Driver
+        , scanString
         , scanStringIO
 
           -- * Locations
@@ -19,13 +20,29 @@
 where
 import Text.Lexer.Inchworm
 import Text.Lexer.Inchworm.Source
+import System.IO.Unsafe
 import qualified Data.Char              as Char
 import qualified Data.List              as List
 import qualified Numeric                as Numeric
 
 
 -- Driver ---------------------------------------------------------------------
--- | Scan a string, using the IO monad to maintain internal state.
+-- | Scan a string.
+scanString
+        :: String
+        -> Scanner IO Location String a
+        -> ([a], Location, String)
+
+scanString str scanner
+ = unsafePerformIO 
+ $ scanListIO
+        (Location 0 0)
+        bumpLocationWithChar 
+        str scanner
+
+
+-- | Implementation for `scanString`,
+--   that uses the IO monad to maintain internal state.
 scanStringIO
         :: String
         -> Scanner IO Location String a
diff --git a/Text/Lexer/Inchworm/Source.hs b/Text/Lexer/Inchworm/Source.hs
--- a/Text/Lexer/Inchworm/Source.hs
+++ b/Text/Lexer/Inchworm/Source.hs
@@ -203,7 +203,7 @@
 -- | A range of locations in a source file.
 data Range loc
         = Range !loc !loc
-        deriving Show
+        deriving (Show, Eq, Ord)
 
 
 -- | A location in a source file.
@@ -215,7 +215,7 @@
         = Location   
                 !Int    -- Line.
                 !Int    -- Column.
-        deriving Show
+        deriving (Show, Eq, Ord)
 
 
 {-# SPECIALIZE INLINE
diff --git a/examples/lispy/Main.hs b/examples/lispy/Main.hs
--- a/examples/lispy/Main.hs
+++ b/examples/lispy/Main.hs
@@ -35,5 +35,5 @@
 main 
  = do   let fileName = "Source.lispy"
         let source   = "(some (Lispy like) 26 Program 93 (for you))"
-        toks    <- scanStringIO source (scanner fileName)
+        let toks     = scanString source (scanner fileName)
         print toks
diff --git a/examples/mlish/Main.hs b/examples/mlish/Main.hs
--- a/examples/mlish/Main.hs
+++ b/examples/mlish/Main.hs
@@ -20,7 +20,7 @@
                 , "'\\137'"
                 , "\"derpo\\ntro\\BELnic\""]
 
-        result  <- scanStringIO source (scanner fileName)
+        let result = scanString source (scanner fileName)
         print result
 
 
diff --git a/inchworm.cabal b/inchworm.cabal
--- a/inchworm.cabal
+++ b/inchworm.cabal
@@ -1,5 +1,5 @@
 name:           inchworm
-version:        1.1.1.1
+version:        1.1.1.2
 license:        MIT
 license-file:   LICENSE
 author:         The Inchworm Development Team
