diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2020 Nikita Volkov
+
+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/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,121 @@
+# Summary
+
+Minimalistic library for encoding JSON directly to strict bytestring.
+
+The library focuses on 2 aspects: **simplicity** and **performance**.
+The API consists of just a few functions and
+achieves performance that gets up to **3 times** better than that of "aeson"
+in typical use-cases.
+In cases where we deal with really large documents (60MB) the performance
+of "aeson" becomes more comparable.
+
+# Performance
+
+## Benchmarks
+
+Following are the benchmark results comparing the performance
+of encoding typical documents using this library and "aeson".
+The numbers after the slash identify the amount of objects in
+the rendered JSON.
+"lazy-aeson" stands for "aeson" producing a lazy bytestring,
+otherwise it's strict.
+
+```
+jsonifier/1                              mean 2.043 μs  ( +- 24.33 ns  )
+jsonifier/10                             mean 12.60 μs  ( +- 139.3 ns  )
+jsonifier/100                            mean 120.8 μs  ( +- 3.271 μs  )
+jsonifier/1,000                          mean 1.275 ms  ( +- 13.45 μs  )
+jsonifier/10,000                         mean 20.71 ms  ( +- 864.1 μs  )
+jsonifier/100,000                        mean 195.2 ms  ( +- 15.26 ms  )
+aeson/1                                  mean 6.400 μs  ( +- 40.03 ns  )
+aeson/10                                 mean 31.40 μs  ( +- 760.1 ns  )
+aeson/100                                mean 262.1 μs  ( +- 4.486 μs  )
+aeson/1,000                              mean 3.413 ms  ( +- 83.81 μs  )
+aeson/10,000                             mean 30.38 ms  ( +- 439.9 μs  )
+aeson/100,000                            mean 275.8 ms  ( +- 5.646 ms  )
+lazy-aeson/1                             mean 6.403 μs  ( +- 58.98 ns  )
+lazy-aeson/10                            mean 30.30 μs  ( +- 447.1 ns  )
+lazy-aeson/100                           mean 257.7 μs  ( +- 4.806 μs  )
+lazy-aeson/1,000                         mean 2.485 ms  ( +- 24.07 μs  )
+lazy-aeson/10,000                        mean 24.89 ms  ( +- 447.1 μs  )
+lazy-aeson/100,000                       mean 245.4 ms  ( +- 1.571 ms  )
+```
+
+Here is the table of the data sizes of produced documents by the amounts of objects:
+
+Objects amount | Data size
+-- | --
+1 | 941B
+10 | 6.4kB
+100 | 60kB
+1,000 | 604kB
+10,000 | 6MB
+100,000 | 60MB
+
+The benchmark suite is bundled with the package.
+
+## Reasoning
+
+Such performance is achieved due to the approach taken to the process of building a bytestring. Unlike "aeson", this library doesn't use the builder distributed with the "bytestring" package, instead it uses a custom solution which produces a bytestring in two steps: first it counts how many bytes the rendering of data will occupy then it allocates a buffer of that exact size and renders directly into it. As the benchmarks show, at least for the purpose of rendering JSON this approach turns out to be faster than manipulations on temporary buffers which the builder from "bytestring" does.
+
+This approach opens doors to optimizations otherwise inaccessible. E.g., we can efficiently count how many bytes a `Text` value encoded as JSON string literal will occupy, then render it into its final destination in one pass. We can efficiently count how many bytes a decimal encoding of an integer will occupy, and also render it in one pass despite the rendering of integers needing to be done in reverse direction and requiring a second pass of reversing the bytes in alternative solutions.
+
+*With all those observations some general concepts have emerged and have been extracted as the lower-level ["ptr-poker" package](https://github.com/nikita-volkov/ptr-poker), which focuses on the problem of populating pointers.*
+
+# Quality
+
+The quality of the library is ensured with a test property in which a random JSON tree is generated, then rendered using "jsonifier", then parsed using "aeson" and compared to the original.
+
+# Demo
+
+Following is a complete program that shows how you can render
+JSON from your domain model.
+
+```haskell
+{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
+
+import qualified Jsonifier as J
+import qualified Data.ByteString.Char8 as Char8ByteString
+
+
+{-|
+Outputs the following:
+
+> {"name":"Metallica","genres":[{"name":"Metal"},{"name":"Rock"},{"name":"Blues"}]}
+-}
+main =
+  Char8ByteString.putStrLn (J.toByteString (artistJson metallica))
+
+metallica :: Artist
+metallica =
+  Artist "Metallica" [Genre "Metal", Genre "Rock", Genre "Blues"]
+
+
+-- * Model
+-------------------------
+
+data Artist =
+  Artist { artistName :: Text, artistGenres :: [Genre] }
+
+data Genre =
+  Genre { genreName :: Text }
+
+
+-- * Encoders
+-------------------------
+
+artistJson :: Artist -> J.Json
+artistJson Artist{..} =
+  J.object [
+    ("name", J.textString artistName),
+    ("genres", J.array (fmap genreJson artistGenres))
+    ]
+
+genreJson :: Genre -> J.Json
+genreJson Genre{..} =
+  J.object [
+    ("name", J.textString genreName)
+    ]
+```
+
+A compilable version of this demo comes bundled with the package as the \"demo\" test-suite.
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/bench/Main.hs b/bench/Main.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main.hs
@@ -0,0 +1,119 @@
+module Main where
+
+import Prelude
+import Gauge.Main
+import qualified Main.Model as Model
+import qualified Main.Jsonifier
+import qualified Main.Aeson
+import qualified Data.Aeson
+import qualified Data.ByteString.Lazy
+import qualified Data.ByteString.Char8 as Char8ByteString
+import qualified Jsonifier
+import qualified Text.Builder as TextBuilder
+
+
+main =
+  do
+    twitter1Data <- load "samples/twitter1.json"
+    twitter10Data <- load "samples/twitter10.json"
+    twitter100Data <- load "samples/twitter100.json"
+    let
+      twitter1000Data = mapResultsOfResult (concat . replicate 10) twitter100Data
+      twitter10000Data = mapResultsOfResult (concat . replicate 10) twitter1000Data
+      twitter100000Data = mapResultsOfResult (concat . replicate 10) twitter10000Data
+
+    -- Ensure that encoders are correct
+    test "jsonifier" encodeWithJsonifier twitter10Data
+    test "aeson" encodeWithAeson twitter10Data
+
+    -- Print out the data sizes of samples
+    TextBuilder.putLnToStdOut $ let
+      sampleDataSize =
+        TextBuilder.dataSizeInBytesInDecimal ',' .
+        Char8ByteString.length .
+        encodeWithJsonifier
+      sample sampleName sampleData =
+        "- " <> TextBuilder.text sampleName <> ": " <>
+        sampleDataSize sampleData
+      in 
+        "Sample data sizes report:\n" <>
+        sample "twitter-1" twitter1Data <> "\n" <>
+        sample "twitter-10" twitter10Data <> "\n" <>
+        sample "twitter-100" twitter100Data <> "\n" <>
+        sample "twitter-1,000" twitter1000Data <> "\n" <>
+        sample "twitter-10,000" twitter10000Data <> "\n" <>
+        sample "twitter-100,000" twitter100000Data
+
+    defaultMain [
+      bgroup "jsonifier" [
+        bench "1" (nf encodeWithJsonifier twitter1Data)
+        ,
+        bench "10" (nf encodeWithJsonifier twitter10Data)
+        ,
+        bench "100" (nf encodeWithJsonifier twitter100Data)
+        ,
+        bench "1,000" (nf encodeWithJsonifier twitter1000Data)
+        ,
+        bench "10,000" (nf encodeWithJsonifier twitter10000Data)
+        ,
+        bench "100,000" (nf encodeWithJsonifier twitter100000Data)
+        ]
+      ,
+      bgroup "aeson" [
+        bench "1" (nf encodeWithAeson twitter1Data)
+        ,
+        bench "10" (nf encodeWithAeson twitter10Data)
+        ,
+        bench "100" (nf encodeWithAeson twitter100Data)
+        ,
+        bench "1,000" (nf encodeWithAeson twitter1000Data)
+        ,
+        bench "10,000" (nf encodeWithAeson twitter10000Data)
+        ,
+        bench "100,000" (nf encodeWithAeson twitter100000Data)
+        ]
+      ,
+      bgroup "lazy-aeson" [
+        bench "1" (nf encodeWithLazyAeson twitter1Data)
+        ,
+        bench "10" (nf encodeWithLazyAeson twitter10Data)
+        ,
+        bench "100" (nf encodeWithLazyAeson twitter100Data)
+        ,
+        bench "1,000" (nf encodeWithLazyAeson twitter1000Data)
+        ,
+        bench "10,000" (nf encodeWithLazyAeson twitter10000Data)
+        ,
+        bench "100,000" (nf encodeWithLazyAeson twitter100000Data)
+        ]
+      ]
+
+load :: FilePath -> IO Model.Result
+load fileName =
+  Data.Aeson.eitherDecodeFileStrict' fileName
+    >>= either fail return
+
+mapResultsOfResult :: ([Model.Story] -> [Model.Story]) -> Model.Result -> Model.Result
+mapResultsOfResult f a =
+  a {Model.results = f (Model.results a)}
+
+test name strictEncoder input =
+  let encoding = strictEncoder input in
+    case Data.Aeson.eitherDecodeStrict' encoding of
+      Right decoding ->
+        if decoding == input
+          then
+            return ()
+          else
+            fail ("Encoder " <> name <> " encodes incorrectly.\nOutput:\n" <> Char8ByteString.unpack encoding)
+      Left err ->
+        fail ("Encoder " <> name <> " failed: " <> err <> ".\nOutput:\n" <> Char8ByteString.unpack encoding)
+
+encodeWithJsonifier =
+  Jsonifier.toByteString . Main.Jsonifier.resultJson
+
+encodeWithAeson =
+  Data.ByteString.Lazy.toStrict . Data.Aeson.encode
+
+encodeWithLazyAeson =
+  Data.Aeson.encode
diff --git a/bench/Main/Aeson.hs b/bench/Main/Aeson.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main/Aeson.hs
@@ -0,0 +1,129 @@
+module Main.Aeson where
+
+import Prelude
+import Main.Model
+import Data.Aeson hiding (Result)
+
+
+instance ToJSON Metadata where
+  toJSON Metadata{..} = object [
+      "result_type" .= result_type
+    ]
+
+  toEncoding Metadata{..} = pairs $
+    "result_type" .= result_type
+
+instance FromJSON Metadata where
+  parseJSON (Object v) = Metadata <$> v .: "result_type"
+  parseJSON _          = empty
+
+instance ToJSON Geo where
+  toJSON Geo{..} = object [
+      "type_"       .= type_
+    , "coordinates" .= coordinates
+    ]
+
+  toEncoding Geo{..} = pairs $
+       "type_"       .= type_
+    <> "coordinates" .= coordinates
+
+instance FromJSON Geo where
+  parseJSON (Object v) = Geo <$>
+        v .: "type_"
+    <*> v .: "coordinates"
+  parseJSON _          = empty
+
+instance ToJSON Story where
+  toJSON Story{..} = object [
+      "from_user_id_str"  .= from_user_id_str
+    , "profile_image_url" .= profile_image_url
+    , "created_at"        .= created_at
+    , "from_user"         .= from_user
+    , "id_str"            .= id_str
+    , "metadata"          .= metadata
+    , "to_user_id"        .= to_user_id
+    , "text"              .= text
+    , "id"                .= id
+    , "from_user_id"      .= from_user_id
+    , "geo"               .= geo
+    , "iso_language_code" .= iso_language_code
+    , "to_user_id_str"    .= to_user_id_str
+    , "source"            .= source
+    ]
+
+  toEncoding Story{..} = pairs $
+       "from_user_id_str"  .= from_user_id_str
+    <> "profile_image_url" .= profile_image_url
+    <> "created_at"        .= created_at
+    <> "from_user"         .= from_user
+    <> "id_str"            .= id_str
+    <> "metadata"          .= metadata
+    <> "to_user_id"        .= to_user_id
+    <> "text"              .= text
+    <> "id"                .= id
+    <> "from_user_id"      .= from_user_id
+    <> "geo"               .= geo
+    <> "iso_language_code" .= iso_language_code
+    <> "to_user_id_str"    .= to_user_id_str
+    <> "source"            .= source
+
+instance FromJSON Story where
+  parseJSON (Object v) = Story <$>
+        v .: "from_user_id_str"
+    <*> v .: "profile_image_url"
+    <*> v .: "created_at"
+    <*> v .: "from_user"
+    <*> v .: "id_str"
+    <*> v .: "metadata"
+    <*> v .: "to_user_id"
+    <*> v .: "text"
+    <*> v .: "id"
+    <*> v .: "from_user_id"
+    <*> v .: "geo"
+    <*> v .: "iso_language_code"
+    <*> v .: "to_user_id_str"
+    <*> v .: "source"
+  parseJSON _ = empty
+
+instance ToJSON Result where
+  toJSON Result{..} = object [
+      "results"          .= results
+    , "max_id"           .= max_id
+    , "since_id"         .= since_id
+    , "refresh_url"      .= refresh_url
+    , "next_page"        .= next_page
+    , "results_per_page" .= results_per_page
+    , "page"             .= page
+    , "completed_in"     .= completed_in
+    , "since_id_str"     .= since_id_str
+    , "max_id_str"       .= max_id_str
+    , "query"            .= query
+    ]
+
+  toEncoding Result{..} = pairs $
+       "results"          .= results
+    <> "max_id"           .= max_id
+    <> "since_id"         .= since_id
+    <> "refresh_url"      .= refresh_url
+    <> "next_page"        .= next_page
+    <> "results_per_page" .= results_per_page
+    <> "page"             .= page
+    <> "completed_in"     .= completed_in
+    <> "since_id_str"     .= since_id_str
+    <> "max_id_str"       .= max_id_str
+    <> "query"            .= query
+
+instance FromJSON Result where
+  parseJSON (Object v) = Result <$>
+        v .: "results"
+    <*> v .: "max_id"
+    <*> v .: "since_id"
+    <*> v .: "refresh_url"
+    <*> v .: "next_page"
+    <*> v .: "results_per_page"
+    <*> v .: "page"
+    <*> v .: "completed_in"
+    <*> v .: "since_id_str"
+    <*> v .: "max_id_str"
+    <*> v .: "query"
+  parseJSON _ = empty
diff --git a/bench/Main/Jsonifier.hs b/bench/Main/Jsonifier.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main/Jsonifier.hs
@@ -0,0 +1,61 @@
+module Main.Jsonifier where
+
+import Prelude hiding (null, bool)
+import Jsonifier
+import qualified Main.Model as A
+
+
+resultJson :: A.Result -> Json
+resultJson A.Result{..} =
+  object [
+    ("results", array (fmap storyJson results)),
+    ("max_id", intNumber max_id),
+    ("since_id", intNumber since_id),
+    ("refresh_url", textString refresh_url),
+    ("next_page", textString next_page),
+    ("results_per_page", intNumber results_per_page),
+    ("page", intNumber page),
+    ("completed_in", doubleNumber completed_in),
+    ("since_id_str", textString since_id_str),
+    ("max_id_str", textString max_id_str),
+    ("query", textString query)
+    ]
+
+storyJson :: A.Story -> Json
+storyJson A.Story{..} =
+  object [
+    ("from_user_id_str", textString from_user_id_str),
+    ("profile_image_url", textString profile_image_url),
+    ("created_at", textString created_at),
+    ("from_user", textString from_user),
+    ("id_str", textString id_str),
+    ("metadata", metadataJson metadata),
+    ("to_user_id", maybe null intNumber to_user_id),
+    ("text", textString text),
+    ("id", intNumber id),
+    ("from_user_id", intNumber from_user_id),
+    ("geo", maybe null geoJson geo),
+    ("iso_language_code", textString iso_language_code),
+    ("to_user_id_str", maybe null textString to_user_id_str),
+    ("source", textString source)
+    ]
+
+geoJson :: A.Geo -> Json
+geoJson A.Geo{..} =
+  object [
+    ("type_", textString type_),
+    ("coordinates", coordinatesJson coordinates)
+    ]
+
+coordinatesJson :: (Double, Double) -> Json
+coordinatesJson (x, y) =
+  array [
+    doubleNumber x,
+    doubleNumber y
+    ]
+
+metadataJson :: A.Metadata -> Json
+metadataJson A.Metadata{..} =
+  object [
+    ("result_type", textString result_type)
+    ]
diff --git a/bench/Main/Model.hs b/bench/Main/Model.hs
new file mode 100644
--- /dev/null
+++ b/bench/Main/Model.hs
@@ -0,0 +1,66 @@
+module Main.Model
+(
+  Metadata(..),
+  Geo(..),
+  Story(..),
+  Result(..)
+)
+where
+
+import Prelude hiding (id)
+
+data Metadata =
+  Metadata {
+    result_type :: Text
+  }
+  deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData Metadata
+
+data Geo =
+  Geo {
+    type_       :: Text,
+    coordinates :: (Double, Double)
+  }
+  deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData Geo
+
+data Story =
+  Story {
+    from_user_id_str  :: Text,
+    profile_image_url :: Text,
+    created_at        :: Text,
+    from_user         :: Text,
+    id_str            :: Text,
+    metadata          :: Metadata,
+    to_user_id        :: Maybe Int,
+    text              :: Text,
+    id                :: Int,
+    from_user_id      :: Int,
+    geo               :: Maybe Geo,
+    iso_language_code :: Text,
+    to_user_id_str    :: Maybe Text,
+    source            :: Text
+  }
+  deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData Story
+
+data Result =
+  Result {
+    results          :: [Story],
+    max_id           :: Int,
+    since_id         :: Int,
+    refresh_url      :: Text,
+    next_page        :: Text,
+    results_per_page :: Int,
+    page             :: Int,
+    completed_in     :: Double,
+    since_id_str     :: Text,
+    max_id_str       :: Text,
+    query            :: Text
+  }
+  deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData Result
diff --git a/cbits/json_allocation.c b/cbits/json_allocation.c
new file mode 100644
--- /dev/null
+++ b/cbits/json_allocation.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2020 Nikita Volkov <nikita.y.volkov@mail.ru>.
+ */
+
+
+#include <string.h>
+#include <stdint.h>
+#include <stdio.h>
+
+
+static const int allocation_by_septet[128] =
+  {6,6,6,6,6,6,6,6,6,2,2,6,6,2,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+
+int count_string_allocation
+(
+  const uint16_t *src_ptr,
+  size_t src_off,
+  size_t src_len
+)
+{
+  src_ptr += src_off;
+  const uint16_t *end_ptr = src_ptr + src_len;
+
+  size_t allocation = 0;
+
+  while (src_ptr < end_ptr) {
+    uint16_t w = *src_ptr++;
+
+    if (w <= 0x7F) {
+      allocation += allocation_by_septet[w];
+    }
+    else if (w <= 0x7FF) {
+      allocation += 2;
+    }
+    else if (w < 0xD800 || w > 0xDBFF) {
+      allocation += 3;
+    } else {
+      src_ptr++;
+      allocation += 4;
+    }
+  }
+
+  return allocation;
+}
diff --git a/cbits/json_encoding.c b/cbits/json_encoding.c
new file mode 100644
--- /dev/null
+++ b/cbits/json_encoding.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2020 Nikita Volkov <nikita.y.volkov@mail.ru>.
+ *
+ * Portions copyright (c) 2011 Bryan O'Sullivan <bos@serpentine.com>.
+ *
+ * Portions copyright (c) 2008-2010 Björn Höhrmann <bjoern@hoehrmann.de>.
+ *
+ * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.
+ */
+
+#include <string.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+
+static const char* digits = "0123456789abcdef";
+
+#define slash_slash_seq '\\' | '\\' << 8
+#define slash_doublequote_seq '\\' | '"' << 8
+#define slash_n_seq '\\' | 'n' << 8
+#define slash_r_seq '\\' | 'r' << 8
+#define slash_t_seq '\\' | 't' << 8
+#define slash_u_seq '\\' | 'u' << 8
+
+static const bool pass_through_by_septet[128] =
+  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+
+static const uint16_t two_byte_seq_by_septet[128] =
+  {0,0,0,0,0,0,0,0,0,slash_t_seq,slash_n_seq,0,0,slash_r_seq,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,slash_doublequote_seq,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,slash_slash_seq};
+
+uint8_t* encode_utf16_as_string
+(
+  uint8_t *dest,
+  const uint16_t *src,
+  size_t src_offset,
+  size_t src_length
+)
+{
+
+  src += src_offset;
+  
+  const uint16_t *src_end = src + src_length;
+
+  *dest++ = 34;
+
+  while (src < src_end) {
+    uint16_t x = *src++;
+
+    if (x <= 0x7F) {
+      if (pass_through_by_septet[x]) {
+        *dest++ = x;
+      } else {
+        uint16_t two_byte_seq = two_byte_seq_by_septet[x];
+        if (two_byte_seq) {
+          *((uint16_t*) dest) = two_byte_seq;
+          dest += 2;
+        } else {
+          // \u
+          *((uint16_t*) dest) = slash_u_seq;
+          dest += 2;
+
+          // hex encoding of 4 nibbles
+          *dest++ = digits[x >> 12 & 0xF];
+          *dest++ = digits[x >> 8 & 0xF];
+          *dest++ = digits[x >> 4 & 0xF];
+          *dest++ = digits[x & 0xF];
+        }
+      }
+    }
+    else if (x <= 0x7FF) {
+      *dest++ = (x >> 6) | 0xC0;
+      *dest++ = (x & 0x3f) | 0x80;
+    }
+    else if (x < 0xD800 || x > 0xDBFF) {
+      *dest++ = (x >> 12) | 0xE0;
+      *dest++ = ((x >> 6) & 0x3F) | 0x80;
+      *dest++ = (x & 0x3F) | 0x80;
+    } else {
+      uint32_t c =
+        ((((uint32_t) x) - 0xD800) << 10) + 
+        (((uint32_t) *src++) - 0xDC00) + 0x10000;
+      *dest++ = (c >> 18) | 0xF0;
+      *dest++ = ((c >> 12) & 0x3F) | 0x80;
+      *dest++ = ((c >> 6) & 0x3F) | 0x80;
+      *dest++ = (c & 0x3F) | 0x80;
+    }
+  }
+
+  *dest++ = 34;
+
+  return dest;
+}
diff --git a/demo/Main.hs b/demo/Main.hs
new file mode 100644
--- /dev/null
+++ b/demo/Main.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
+
+import qualified Jsonifier as J
+import qualified Data.ByteString.Char8 as Char8ByteString
+
+
+{-|
+Outputs the following:
+
+> {"name":"Metallica","genres":[{"name":"Metal"},{"name":"Rock"},{"name":"Blues"}]}
+-}
+main =
+  Char8ByteString.putStrLn (J.toByteString (artistJson metallica))
+
+metallica :: Artist
+metallica =
+  Artist "Metallica" [Genre "Metal", Genre "Rock", Genre "Blues"]
+
+
+-- * Model
+-------------------------
+
+data Artist =
+  Artist { artistName :: Text, artistGenres :: [Genre] }
+
+data Genre =
+  Genre { genreName :: Text }
+
+
+-- * Encoders
+-------------------------
+
+artistJson :: Artist -> J.Json
+artistJson Artist{..} =
+  J.object [
+    ("name", J.textString artistName),
+    ("genres", J.array (fmap genreJson artistGenres))
+    ]
+
+genreJson :: Genre -> J.Json
+genreJson Genre{..} =
+  J.object [
+    ("name", J.textString genreName)
+    ]
diff --git a/jsonifier.cabal b/jsonifier.cabal
new file mode 100644
--- /dev/null
+++ b/jsonifier.cabal
@@ -0,0 +1,95 @@
+name: jsonifier
+version: 0.1
+synopsis: Fast and simple JSON encoding toolkit
+description:
+  Minimalistic library for encoding JSON directly to strict bytestring.
+  .
+  The library focuses on 2 aspects: simplicity and performance.
+  The API consists of just a few functions and
+  achieves performance that is 3 times better than that of \"aeson\"
+  in typical use-cases.
+  In cases where we deal with really large documents (60MB) the performance
+  of \"aeson\" becomes more comparable.
+  .
+  For further details please refer to README.
+category: JSON
+homepage: https://github.com/nikita-volkov/jsonifier
+bug-reports: https://github.com/nikita-volkov/jsonifier/issues
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
+copyright: (c) 2020 Nikita Volkov
+license: MIT
+license-file: LICENSE
+build-type: Simple
+cabal-version: >=1.10
+extra-source-files:
+  README.md
+  samples/*.json
+
+source-repository head
+  type: git
+  location: git://github.com/nikita-volkov/jsonifier.git
+
+library
+  hs-source-dirs: library
+  default-extensions: BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, InstanceSigs, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples, ViewPatterns
+  default-language: Haskell2010
+  exposed-modules:
+    Jsonifier
+  other-modules:
+    Jsonifier.Allocation
+    Jsonifier.Ffi
+    Jsonifier.Poke
+    Jsonifier.Prelude
+    Jsonifier.Write
+  c-sources:
+    cbits/json_allocation.c
+    cbits/json_encoding.c
+  build-depends:
+    base >=4.11 && <5,
+    bytestring >=0.10.10 && <0.12,
+    ptr-poker >=0.1 && <0.2,
+    scientific >=0.3.6.2 && <0.4,
+    text >=1 && <2
+
+test-suite demo
+  type: exitcode-stdio-1.0
+  hs-source-dirs: demo
+  main-is: Main.hs
+  default-language: Haskell2010
+  build-depends:
+    jsonifier,
+    rerebase
+
+test-suite test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  default-extensions: BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, InstanceSigs, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples, ViewPatterns
+  default-language: Haskell2010
+  main-is: Main.hs
+  other-modules:
+    Main.Util.HedgehogGens
+  build-depends:
+    aeson >=1.4.7.1 && <2,
+    hedgehog >=1.0.3 && <2,
+    jsonifier,
+    numeric-limits >=0.1 && <0.2,
+    rerebase >=1.10.0.1 && <2
+
+benchmark bench
+  type: exitcode-stdio-1.0
+  hs-source-dirs: bench
+  main-is: Main.hs
+  other-modules:
+    Main.Aeson
+    Main.Jsonifier
+    Main.Model
+  ghc-options: -O2 -threaded "-with-rtsopts=-N"
+  default-extensions: BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, InstanceSigs, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples, ViewPatterns
+  default-language: Haskell2010
+  build-depends:
+    aeson >=1.5.4.1 && <1.6,
+    gauge >=0.2.5 && <0.3,
+    jsonifier,
+    rerebase >=1.10.0.1 && <2,
+    text-builder >=0.6.6.1 && <0.7
diff --git a/library/Jsonifier.hs b/library/Jsonifier.hs
new file mode 100644
--- /dev/null
+++ b/library/Jsonifier.hs
@@ -0,0 +1,209 @@
+module Jsonifier
+(
+  -- * ByteString
+  toByteString,
+  -- * Json
+  Json,
+  -- ** Primitives
+  null,
+  bool,
+  -- ** Numbers
+  intNumber,
+  wordNumber,
+  doubleNumber,
+  scientificNumber,
+  -- ** Strings
+  textString,
+  scientificString,
+  -- ** Composites
+  array,
+  object,
+)
+where
+
+import Jsonifier.Prelude hiding (null, bool)
+import PtrPoker.Poke (Poke)
+import PtrPoker.Write (Write)
+import qualified Jsonifier.Allocation as Allocation
+import qualified Jsonifier.Poke as Poke
+import qualified Jsonifier.Write as Write
+import qualified PtrPoker.Poke as Poke
+import qualified PtrPoker.Write as Write
+import qualified Data.ByteString as ByteString
+import qualified Data.ByteString.Internal as ByteString
+
+
+{-|
+Render a JSON value into strict bytestring.
+-}
+{-# INLINE toByteString #-}
+toByteString :: Json -> ByteString
+toByteString =
+  Write.writeToByteString . coerce
+
+
+-- * Json
+-------------------------
+
+{-|
+Specification of how to render a JSON value to 'ByteString'.
+A sort of a JSON-specialized string 'ByteString' builder.
+
+You can construct it by using the specialized
+conversion functions from Haskell types.
+After constructing, you can convert to strict 'ByteString'
+using the 'toByteString' function.
+-}
+newtype Json =
+  Json Write.Write
+
+{-# INLINE write #-}
+write :: Int -> Poke.Poke -> Json
+write size poke =
+  Json (Write.Write size poke)
+
+{-|
+JSON Null literal.
+-}
+{-# INLINE null #-}
+null :: Json
+null =
+  write 4 Poke.null
+
+{-|
+JSON Boolean literal.
+-}
+{-# INLINE bool #-}
+bool :: Bool -> Json
+bool =
+  \ case
+    True ->
+      write 4 Poke.true
+    False ->
+      write 5 Poke.false
+
+{-|
+JSON Number literal from @Int@.
+-}
+{-# INLINE intNumber #-}
+intNumber :: Int -> Json
+intNumber =
+  Json . Write.intAsciiDec
+
+{-|
+JSON Number literal from @Word@.
+-}
+{-# INLINE wordNumber #-}
+wordNumber :: Word -> Json
+wordNumber =
+  Json . Write.wordAsciiDec
+
+{-|
+JSON Number literal from @Double@.
+
+Since JSON doesn\'t have support for them,
+non-real values like @NaN@, @Infinity@, @-Infinity@ get rendered as @0@.
+-}
+{-# INLINE doubleNumber #-}
+doubleNumber :: Double -> Json
+doubleNumber =
+  Json . Write.zeroNonRealDoubleAsciiDec
+
+{-|
+JSON Number literal from @Scientific@.
+-}
+{-# INLINE scientificNumber #-}
+scientificNumber :: Scientific -> Json
+scientificNumber =
+  Json . Write.scientificAsciiDec
+
+{-|
+JSON String literal from @Text@.
+-}
+{-# INLINE textString #-}
+textString :: Text -> Json
+textString text =
+  let
+    allocation =
+      2 + Allocation.stringBody text
+    poke =
+      Poke.string text
+    in write allocation poke
+
+{-|
+JSON String literal from @Scientific@.
+
+You may need this when the reader of your JSON
+cannot handle large number literals.
+-}
+{-# INLINE scientificString #-}
+scientificString :: Scientific -> Json
+scientificString =
+  Json . Write.scientificString
+
+{-|
+JSON Array literal from a foldable over element literals.
+
+Don\'t be afraid to use 'fmap' to map the elements of the input datastructure,
+it will all be optimized away.
+-}
+{-# INLINE array #-}
+array :: Foldable f => f Json -> Json
+array foldable =
+  write size poke
+  where
+    size =
+      foldr step finalize foldable 0 0
+      where
+        step (Json (Write.Write writeSize _)) next !count !size =
+          next (succ count) (writeSize + size)
+        finalize count size =
+          Allocation.array count size
+    poke =
+      Poke.Poke $
+        Poke.pokePtr Poke.openingSquareBracket >=>
+        foldr step finalize foldable True
+      where
+        step (Json (Write.Write _ poke)) next first =
+          if first
+            then
+              Poke.pokePtr poke >=>
+              next False
+            else
+              Poke.pokePtr Poke.comma >=>
+              Poke.pokePtr poke >=>
+              next False
+        finalize _ =
+          Poke.pokePtr Poke.closingSquareBracket
+
+{-|
+JSON Array literal from a foldable over pairs of key to value literal.
+
+Don\'t be afraid to use 'fmap' to map the elements of the input datastructure,
+it will all be optimized away.
+-}
+{-# INLINE object #-}
+object :: Foldable f => f (Text, Json) -> Json
+object f =
+  foldr step finalize f True 0 0 mempty
+  where
+    step (key, Json (Write.Write{..})) next first !size !allocation !poke =
+      if first
+        then
+          next False 1 rowAllocation rowPoke
+        else
+          next False (succ size) (allocation + rowAllocation)
+            (poke <> Poke.comma <> rowPoke)
+      where
+        rowAllocation =
+          Allocation.stringBody key +
+          writeSize
+        rowPoke =
+          Poke.objectRow key writePoke
+    finalize _ size contentsAllocation bodyPoke =
+      write allocation poke
+      where
+        allocation =
+          Allocation.object size contentsAllocation
+        poke =
+          Poke.openingCurlyBracket <> bodyPoke <> Poke.closingCurlyBracket
diff --git a/library/Jsonifier/Allocation.hs b/library/Jsonifier/Allocation.hs
new file mode 100644
--- /dev/null
+++ b/library/Jsonifier/Allocation.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE UnliftedFFITypes #-}
+module Jsonifier.Allocation
+where
+
+import Jsonifier.Prelude
+import qualified Data.Text.Internal as Text
+import qualified Data.Text.Array as TextArray
+import qualified Jsonifier.Ffi as Ffi
+
+
+{-# INLINE object #-}
+object :: Int -> Int -> Int
+object rowsAmount contentsAllocation =
+  curlies + commas rowsAmount + colonsAndQuotes + contentsAllocation
+  where
+    curlies =
+      2
+    colonsAndQuotes =
+      rowsAmount * 3
+
+{-# INLINE array #-}
+array :: Int -> Int -> Int
+array elementsAmount contentsAllocation =
+  brackets + commas elementsAmount + contentsAllocation
+  where
+    brackets =
+      2
+
+{-# INLINE commas #-}
+commas rowsAmount =
+  if rowsAmount <= 1
+    then 0
+    else pred rowsAmount
+
+{-|
+Amount of bytes required for an escaped JSON string value without quotes.
+
+https://hackage.haskell.org/package/text-1.2.4.0/docs/src/Data.Text.Encoding.html#encodeUtf8BuilderEscaped
+-}
+stringBody :: Text -> Int
+stringBody (Text.Text arr off len) =
+  Ffi.countStringAllocationSize
+    (TextArray.aBA arr) (fromIntegral off) (fromIntegral len)
+    & unsafeDupablePerformIO
+    & fromIntegral
diff --git a/library/Jsonifier/Ffi.hs b/library/Jsonifier/Ffi.hs
new file mode 100644
--- /dev/null
+++ b/library/Jsonifier/Ffi.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE UnliftedFFITypes #-}
+module Jsonifier.Ffi
+where
+
+import Jsonifier.Prelude
+import Foreign.C
+import GHC.Base (ByteArray#, MutableByteArray#)
+
+
+foreign import ccall unsafe "static count_string_allocation"
+  countStringAllocationSize :: ByteArray# -> CSize -> CSize -> IO CInt
+
+foreign import ccall unsafe "static encode_utf16_as_string"
+  encodeString :: Ptr Word8 -> ByteArray# -> CSize -> CSize -> IO (Ptr Word8)
diff --git a/library/Jsonifier/Poke.hs b/library/Jsonifier/Poke.hs
new file mode 100644
--- /dev/null
+++ b/library/Jsonifier/Poke.hs
@@ -0,0 +1,96 @@
+module Jsonifier.Poke
+where
+
+import Jsonifier.Prelude
+import PtrPoker.Poke
+import qualified Data.Text.Internal as Text
+import qualified Data.Text.Array as TextArray
+import qualified Jsonifier.Ffi as Ffi
+
+
+null :: Poke
+null =
+  byteString "null"
+
+{-# INLINE boolean #-}
+boolean :: Bool -> Poke
+boolean =
+  bool false true
+
+true :: Poke
+true =
+  byteString "true"
+
+false :: Poke
+false =
+  byteString "false"
+
+{-# INLINE string #-}
+string :: Text -> Poke
+string (Text.Text arr off len) =
+  Poke $ \ ptr ->
+    Ffi.encodeString ptr (TextArray.aBA arr) (fromIntegral off) (fromIntegral len)
+
+{-|
+> "key":value
+-}
+{-# INLINE objectRow #-}
+objectRow :: Text -> Poke -> Poke
+objectRow keyBody valuePoke =
+  string keyBody <> colon <> valuePoke
+
+{-# INLINE array #-}
+array :: Foldable f => f Poke -> Poke
+array f =
+  snd (foldl' (\ (first, acc) p -> (False, acc <> if first then p else comma <> p))
+      (True, openingSquareBracket) f) <>
+  closingSquareBracket
+
+{-# INLINE object #-}
+object :: Poke -> Poke
+object body =
+  openingCurlyBracket <> body <> closingCurlyBracket
+
+{-# INLINE objectBody #-}
+objectBody :: Foldable f => f Poke -> Poke
+objectBody =
+  foldl'
+    (\ (first, acc) p -> (False, acc <> if first then p else comma <> p))
+    (True, mempty)
+    >>> snd
+
+emptyArray :: Poke
+emptyArray =
+  byteString "[]"
+
+emptyObject :: Poke
+emptyObject =
+  byteString "{}"
+
+openingSquareBracket :: Poke
+openingSquareBracket =
+  word8 91
+
+closingSquareBracket :: Poke
+closingSquareBracket =
+  word8 93
+
+openingCurlyBracket :: Poke
+openingCurlyBracket =
+  word8 123
+
+closingCurlyBracket :: Poke
+closingCurlyBracket =
+  word8 125
+
+colon :: Poke
+colon =
+  word8 58
+
+comma :: Poke
+comma =
+  word8 44
+
+doubleQuote :: Poke
+doubleQuote =
+  word8 34
diff --git a/library/Jsonifier/Prelude.hs b/library/Jsonifier/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/library/Jsonifier/Prelude.hs
@@ -0,0 +1,93 @@
+module Jsonifier.Prelude
+( 
+  module Exports,
+  showAsText,
+)
+where
+
+-- base
+-------------------------
+import Control.Applicative as Exports hiding (WrappedArrow(..))
+import Control.Arrow as Exports hiding (first, second)
+import Control.Category as Exports
+import Control.Concurrent as Exports
+import Control.Exception as Exports
+import Control.Monad as Exports hiding (fail, mapM_, sequence_, forM_, msum, mapM, sequence, forM)
+import Control.Monad.IO.Class as Exports
+import Control.Monad.Fail as Exports
+import Control.Monad.Fix as Exports hiding (fix)
+import Control.Monad.ST as Exports
+import Data.Bifunctor as Exports
+import Data.Bits as Exports
+import Data.Bool as Exports
+import Data.Char as Exports
+import Data.Coerce as Exports
+import Data.Complex as Exports
+import Data.Data as Exports
+import Data.Dynamic as Exports
+import Data.Either as Exports
+import Data.Fixed as Exports
+import Data.Foldable as Exports hiding (toList)
+import Data.Function as Exports hiding (id, (.))
+import Data.Functor as Exports
+import Data.Functor.Compose as Exports
+import Data.Int as Exports
+import Data.IORef as Exports
+import Data.Ix as Exports
+import Data.List as Exports hiding (sortOn, isSubsequenceOf, uncons, concat, foldr, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, find, maximumBy, minimumBy, mapAccumL, mapAccumR, foldl')
+import Data.List.NonEmpty as Exports (NonEmpty(..))
+import Data.Maybe as Exports
+import Data.Monoid as Exports hiding (Alt)
+import Data.Ord as Exports
+import Data.Proxy as Exports
+import Data.Ratio as Exports
+import Data.Semigroup as Exports hiding (First(..), Last(..))
+import Data.STRef as Exports
+import Data.String as Exports
+import Data.Traversable as Exports
+import Data.Tuple as Exports
+import Data.Unique as Exports
+import Data.Version as Exports
+import Data.Void as Exports
+import Data.Word as Exports
+import Debug.Trace as Exports
+import Foreign.ForeignPtr as Exports
+import Foreign.Ptr as Exports
+import Foreign.StablePtr as Exports
+import Foreign.Storable as Exports
+import GHC.Conc as Exports hiding (orElse, withMVar, threadWaitWriteSTM, threadWaitWrite, threadWaitReadSTM, threadWaitRead)
+import GHC.Exts as Exports (IsList(..), lazy, inline, sortWith, groupWith)
+import GHC.Generics as Exports (Generic)
+import GHC.IO.Exception as Exports
+import GHC.OverloadedLabels as Exports
+import Numeric as Exports
+import Prelude as Exports hiding (fail, concat, foldr, mapM_, sequence_, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, mapM, sequence, id, (.))
+import System.Environment as Exports
+import System.Exit as Exports
+import System.IO as Exports (Handle, hClose)
+import System.IO.Error as Exports
+import System.IO.Unsafe as Exports
+import System.Mem as Exports
+import System.Mem.StableName as Exports
+import System.Timeout as Exports
+import Text.ParserCombinators.ReadP as Exports (ReadP, readP_to_S, readS_to_P)
+import Text.ParserCombinators.ReadPrec as Exports (ReadPrec, readPrec_to_P, readP_to_Prec, readPrec_to_S, readS_to_Prec)
+import Text.Printf as Exports (printf, hPrintf)
+import Text.Read as Exports (Read(..), readMaybe, readEither)
+import Unsafe.Coerce as Exports
+
+-- text
+-------------------------
+import Data.Text as Exports (Text)
+
+-- bytestring
+-------------------------
+import Data.ByteString as Exports (ByteString)
+
+-- scientific
+-------------------------
+import Data.Scientific as Exports (Scientific)
+
+
+showAsText :: Show a => a -> Text
+showAsText = show >>> fromString
diff --git a/library/Jsonifier/Write.hs b/library/Jsonifier/Write.hs
new file mode 100644
--- /dev/null
+++ b/library/Jsonifier/Write.hs
@@ -0,0 +1,14 @@
+module Jsonifier.Write
+where
+
+import Jsonifier.Prelude
+import PtrPoker.Write
+import qualified Jsonifier.Poke as Poke
+
+
+{-# INLINE scientificString #-}
+scientificString :: Scientific -> Write
+scientificString a =
+  case scientificAsciiDec a of
+    Write size poke ->
+      Write (size + 2) (Poke.doubleQuote <> poke <> Poke.doubleQuote)
diff --git a/samples/twitter1.json b/samples/twitter1.json
new file mode 100644
--- /dev/null
+++ b/samples/twitter1.json
@@ -0,0 +1,33 @@
+{
+  "results": [
+    {
+      "from_user_id_str": "3646730",
+      "profile_image_url": "http://a3.twimg.com/profile_images/404973767/avatar_normal.jpg",
+      "created_at": "Wed, 26 Jan 2011 04:35:07 +0000",
+      "from_user": "nicolaslara",
+      "id_str": "30121530767708160",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": 18616016,
+      "text": "@josej30 Python y Clojure. Obviamente son diferentes, y cada uno tiene sus ventajas y desventajas. De Haskell faltaría pattern matching",
+      "id": 30121530767708160,
+      "from_user_id": 3646730,
+      "to_user": "josej30",
+      "geo": null,
+      "iso_language_code": "es",
+      "to_user_id_str": "18616016",
+      "source": "&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"
+    }
+  ],
+  "max_id": 30121530767708160,
+  "since_id": 0,
+  "refresh_url": "?since_id=30121530767708160&q=haskell",
+  "next_page": "?page=2&max_id=30121530767708160&rpp=100&q=haskell",
+  "results_per_page": 100,
+  "page": 1,
+  "completed_in": 1.195569,
+  "since_id_str": "0",
+  "max_id_str": "30121530767708160",
+  "query": "haskell"
+}
diff --git a/samples/twitter10.json b/samples/twitter10.json
new file mode 100644
--- /dev/null
+++ b/samples/twitter10.json
@@ -0,0 +1,196 @@
+{
+  "results": [
+    {
+      "from_user_id_str": "3646730",
+      "profile_image_url": "http://a3.twimg.com/profile_images/404973767/avatar_normal.jpg",
+      "created_at": "Wed, 26 Jan 2011 04:35:07 +0000",
+      "from_user": "nicolaslara",
+      "id_str": "30121530767708160",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": 18616016,
+      "text": "@josej30 Python y Clojure. Obviamente son diferentes, y cada uno tiene sus ventajas y desventajas. De Haskell faltaría pattern matching",
+      "id": 30121530767708160,
+      "from_user_id": 3646730,
+      "to_user": "josej30",
+      "geo": null,
+      "iso_language_code": "es",
+      "to_user_id_str": "18616016",
+      "source": "&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "207858021",
+      "profile_image_url": "http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png",
+      "created_at": "Wed, 26 Jan 2011 04:30:38 +0000",
+      "from_user": "pboudarga",
+      "id_str": "30120402839666689",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "I'm at Rolla Sushi Grill (27737 Bouquet Canyon Road, #106, Btw Haskell Canyon and Rosedell Drive, Saugus) http://4sq.com/gqqdhs",
+      "id": 30120402839666689,
+      "from_user_id": 207858021,
+      "geo": null,
+      "iso_language_code": "en",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://foursquare.com&quot; rel=&quot;nofollow&quot;&gt;foursquare&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "69988683",
+      "profile_image_url": "http://a0.twimg.com/profile_images/1211955817/avatar_7888_normal.gif",
+      "created_at": "Wed, 26 Jan 2011 04:25:23 +0000",
+      "from_user": "YNK33",
+      "id_str": "30119083059978240",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "hsndfile 0.5.0: Free and open source Haskell bindings for libsndfile http://bit.ly/gHaBWG Mac Os",
+      "id": 30119083059978240,
+      "from_user_id": 69988683,
+      "geo": null,
+      "iso_language_code": "en",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "81492",
+      "profile_image_url": "http://a1.twimg.com/profile_images/423894208/Picture_7_normal.jpg",
+      "created_at": "Wed, 26 Jan 2011 04:24:28 +0000",
+      "from_user": "satzz",
+      "id_str": "30118851488251904",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "Emacsのモード表示が今(Ruby Controller Outputz RoR Flymake REl hs)となっててよくわからないんだけど最後のRElとかhsって何だろう…haskellとか2年以上書いてないけど…",
+      "id": 30118851488251904,
+      "from_user_id": 81492,
+      "geo": null,
+      "iso_language_code": "ja",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://www.hootsuite.com&quot; rel=&quot;nofollow&quot;&gt;HootSuite&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "9518356",
+      "profile_image_url": "http://a2.twimg.com/profile_images/119165723/ocaml-icon_normal.png",
+      "created_at": "Wed, 26 Jan 2011 04:19:19 +0000",
+      "from_user": "planet_ocaml",
+      "id_str": "30117557788741632",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "I so miss #haskell type classes in #ocaml - i want to do something like refinement. Also why does ocaml not have... http://bit.ly/geYRwt",
+      "id": 30117557788741632,
+      "from_user_id": 9518356,
+      "geo": null,
+      "iso_language_code": "en",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "218059",
+      "profile_image_url": "http://a1.twimg.com/profile_images/1053837723/twitter-icon9_normal.jpg",
+      "created_at": "Wed, 26 Jan 2011 04:16:32 +0000",
+      "from_user": "aprikip",
+      "id_str": "30116854940835840",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "yatex-modeやhaskell-modeのことですね、わかります。",
+      "id": 30116854940835840,
+      "from_user_id": 218059,
+      "geo": null,
+      "iso_language_code": "ja",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://sites.google.com/site/yorufukurou/&quot; rel=&quot;nofollow&quot;&gt;YoruFukurou&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "216363",
+      "profile_image_url": "http://a1.twimg.com/profile_images/72454310/Tim-Avatar_normal.png",
+      "created_at": "Wed, 26 Jan 2011 04:15:30 +0000",
+      "from_user": "dysinger",
+      "id_str": "30116594684264448",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "Haskell in Hawaii tonight for me... #fun",
+      "id": 30116594684264448,
+      "from_user_id": 216363,
+      "geo": null,
+      "iso_language_code": "en",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://www.nambu.com/&quot; rel=&quot;nofollow&quot;&gt;Nambu&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "1774820",
+      "profile_image_url": "http://a2.twimg.com/profile_images/61169291/dan_desert_thumb_normal.jpg",
+      "created_at": "Wed, 26 Jan 2011 04:13:36 +0000",
+      "from_user": "DanMil",
+      "id_str": "30116117682851840",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": 1594784,
+      "text": "@ojrac @chewedwire @tomheon Haskell isn't a language, it's a belief system.  A seductive one...",
+      "id": 30116117682851840,
+      "from_user_id": 1774820,
+      "to_user": "ojrac",
+      "geo": null,
+      "iso_language_code": "en",
+      "to_user_id_str": "1594784",
+      "source": "&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "659256",
+      "profile_image_url": "http://a0.twimg.com/profile_images/746976711/angular-final_normal.jpg",
+      "created_at": "Wed, 26 Jan 2011 04:11:06 +0000",
+      "from_user": "djspiewak",
+      "id_str": "30115488931520512",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "One of the very nice things about Haskell as opposed to SML is the reduced proliferation of identifiers (e.g. andb, orb, etc). #typeclasses",
+      "id": 30115488931520512,
+      "from_user_id": 659256,
+      "geo": null,
+      "iso_language_code": "en",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"
+    },
+    {
+      "from_user_id_str": "144546280",
+      "profile_image_url": "http://a1.twimg.com/a/1295051201/images/default_profile_1_normal.png",
+      "created_at": "Wed, 26 Jan 2011 04:06:12 +0000",
+      "from_user": "listwarenet",
+      "id_str": "30114255890026496",
+      "metadata": {
+        "result_type": "recent"
+      },
+      "to_user_id": null,
+      "text": "http://www.listware.net/201101/haskell-cafe/84752-re-haskell-cafe-gpl-license-of-h-matrix-and-prelude-numeric.html Re: Haskell-c",
+      "id": 30114255890026496,
+      "from_user_id": 144546280,
+      "geo": null,
+      "iso_language_code": "no",
+      "to_user_id_str": null,
+      "source": "&lt;a href=&quot;http://1e10.org/cloud/&quot; rel=&quot;nofollow&quot;&gt;1e10&lt;/a&gt;"
+    }
+  ],
+  "max_id": 30121530767708160,
+  "since_id": 0,
+  "refresh_url": "?since_id=30121530767708160&q=haskell",
+  "next_page": "?page=2&max_id=30121530767708160&rpp=100&q=haskell",
+  "results_per_page": 100,
+  "page": 1,
+  "completed_in": 1.195569,
+  "since_id_str": "0",
+  "max_id_str": "30121530767708160",
+  "query": "haskell"
+}
diff --git a/samples/twitter100.json b/samples/twitter100.json
new file mode 100644
--- /dev/null
+++ b/samples/twitter100.json
@@ -0,0 +1,1 @@
+{"results":[{"from_user_id_str":"3646730","profile_image_url":"http://a3.twimg.com/profile_images/404973767/avatar_normal.jpg","created_at":"Wed, 26 Jan 2011 04:35:07 +0000","from_user":"nicolaslara","id_str":"30121530767708160","metadata":{"result_type":"recent"},"to_user_id":18616016,"text":"@josej30 Python y Clojure. Obviamente son diferentes, y cada uno tiene sus ventajas y desventajas. De Haskell faltar\u00eda pattern matching","id":30121530767708160,"from_user_id":3646730,"to_user":"josej30","geo":null,"iso_language_code":"es","to_user_id_str":"18616016","source":"&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"},{"from_user_id_str":"207858021","profile_image_url":"http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png","created_at":"Wed, 26 Jan 2011 04:30:38 +0000","from_user":"pboudarga","id_str":"30120402839666689","metadata":{"result_type":"recent"},"to_user_id":null,"text":"I'm at Rolla Sushi Grill (27737 Bouquet Canyon Road, #106, Btw Haskell Canyon and Rosedell Drive, Saugus) http://4sq.com/gqqdhs","id":30120402839666689,"from_user_id":207858021,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://foursquare.com&quot; rel=&quot;nofollow&quot;&gt;foursquare&lt;/a&gt;"},{"from_user_id_str":"69988683","profile_image_url":"http://a0.twimg.com/profile_images/1211955817/avatar_7888_normal.gif","created_at":"Wed, 26 Jan 2011 04:25:23 +0000","from_user":"YNK33","id_str":"30119083059978240","metadata":{"result_type":"recent"},"to_user_id":null,"text":"hsndfile 0.5.0: Free and open source Haskell bindings for libsndfile http://bit.ly/gHaBWG Mac Os","id":30119083059978240,"from_user_id":69988683,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"81492","profile_image_url":"http://a1.twimg.com/profile_images/423894208/Picture_7_normal.jpg","created_at":"Wed, 26 Jan 2011 04:24:28 +0000","from_user":"satzz","id_str":"30118851488251904","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Emacs\u306e\u30e2\u30fc\u30c9\u8868\u793a\u304c\u4eca(Ruby Controller Outputz RoR Flymake REl hs)\u3068\u306a\u3063\u3066\u3066\u3088\u304f\u308f\u304b\u3089\u306a\u3044\u3093\u3060\u3051\u3069\u6700\u5f8c\u306eREl\u3068\u304bhs\u3063\u3066\u4f55\u3060\u308d\u3046\u2026haskell\u3068\u304b2\u5e74\u4ee5\u4e0a\u66f8\u3044\u3066\u306a\u3044\u3051\u3069\u2026","id":30118851488251904,"from_user_id":81492,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.hootsuite.com&quot; rel=&quot;nofollow&quot;&gt;HootSuite&lt;/a&gt;"},{"from_user_id_str":"9518356","profile_image_url":"http://a2.twimg.com/profile_images/119165723/ocaml-icon_normal.png","created_at":"Wed, 26 Jan 2011 04:19:19 +0000","from_user":"planet_ocaml","id_str":"30117557788741632","metadata":{"result_type":"recent"},"to_user_id":null,"text":"I so miss #haskell type classes in #ocaml - i want to do something like refinement. Also why does ocaml not have... http://bit.ly/geYRwt","id":30117557788741632,"from_user_id":9518356,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"218059","profile_image_url":"http://a1.twimg.com/profile_images/1053837723/twitter-icon9_normal.jpg","created_at":"Wed, 26 Jan 2011 04:16:32 +0000","from_user":"aprikip","id_str":"30116854940835840","metadata":{"result_type":"recent"},"to_user_id":null,"text":"yatex-mode\u3084haskell-mode\u306e\u3053\u3068\u3067\u3059\u306d\u3001\u308f\u304b\u308a\u307e\u3059\u3002","id":30116854940835840,"from_user_id":218059,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://sites.google.com/site/yorufukurou/&quot; rel=&quot;nofollow&quot;&gt;YoruFukurou&lt;/a&gt;"},{"from_user_id_str":"216363","profile_image_url":"http://a1.twimg.com/profile_images/72454310/Tim-Avatar_normal.png","created_at":"Wed, 26 Jan 2011 04:15:30 +0000","from_user":"dysinger","id_str":"30116594684264448","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Haskell in Hawaii tonight for me... #fun","id":30116594684264448,"from_user_id":216363,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.nambu.com/&quot; rel=&quot;nofollow&quot;&gt;Nambu&lt;/a&gt;"},{"from_user_id_str":"1774820","profile_image_url":"http://a2.twimg.com/profile_images/61169291/dan_desert_thumb_normal.jpg","created_at":"Wed, 26 Jan 2011 04:13:36 +0000","from_user":"DanMil","id_str":"30116117682851840","metadata":{"result_type":"recent"},"to_user_id":1594784,"text":"@ojrac @chewedwire @tomheon Haskell isn't a language, it's a belief system.  A seductive one...","id":30116117682851840,"from_user_id":1774820,"to_user":"ojrac","geo":null,"iso_language_code":"en","to_user_id_str":"1594784","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"659256","profile_image_url":"http://a0.twimg.com/profile_images/746976711/angular-final_normal.jpg","created_at":"Wed, 26 Jan 2011 04:11:06 +0000","from_user":"djspiewak","id_str":"30115488931520512","metadata":{"result_type":"recent"},"to_user_id":null,"text":"One of the very nice things about Haskell as opposed to SML is the reduced proliferation of identifiers (e.g. andb, orb, etc). #typeclasses","id":30115488931520512,"from_user_id":659256,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"},{"from_user_id_str":"144546280","profile_image_url":"http://a1.twimg.com/a/1295051201/images/default_profile_1_normal.png","created_at":"Wed, 26 Jan 2011 04:06:12 +0000","from_user":"listwarenet","id_str":"30114255890026496","metadata":{"result_type":"recent"},"to_user_id":null,"text":"http://www.listware.net/201101/haskell-cafe/84752-re-haskell-cafe-gpl-license-of-h-matrix-and-prelude-numeric.html Re: Haskell-c","id":30114255890026496,"from_user_id":144546280,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://1e10.org/cloud/&quot; rel=&quot;nofollow&quot;&gt;1e10&lt;/a&gt;"},{"from_user_id_str":"1594784","profile_image_url":"http://a2.twimg.com/profile_images/378515773/square-profile_normal.jpg","created_at":"Wed, 26 Jan 2011 04:01:29 +0000","from_user":"ojrac","id_str":"30113067333324800","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @tomheon: @ojrac @chewedwire Don't worry, learning Haskell will not give you any clear idea what monad means.","id":30113067333324800,"from_user_id":1594784,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"207589736","profile_image_url":"http://a3.twimg.com/profile_images/1225527428/headshot_1_normal.jpg","created_at":"Wed, 26 Jan 2011 04:00:13 +0000","from_user":"ashleevelazq101","id_str":"30112747555397632","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Federal investigation finds safety violations at The Acadia Hospital: By Meg Haskell, BDN Staff The investigatio... http://bit.ly/dONnpn","id":30112747555397632,"from_user_id":207589736,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"17671137","profile_image_url":"http://a2.twimg.com/profile_images/290264834/Haskell-logo-outer-glow_normal.png","created_at":"Wed, 26 Jan 2011 03:58:00 +0000","from_user":"Hackage","id_str":"30112192346984448","metadata":{"result_type":"recent"},"to_user_id":null,"text":"streams 0.4, added by EdwardKmett: Various Haskell 2010 stream comonads http://bit.ly/idBkPe","id":30112192346984448,"from_user_id":17671137,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"17489366","profile_image_url":"http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png","created_at":"Wed, 26 Jan 2011 03:58:00 +0000","from_user":"aapnoot","id_str":"30112191881420800","metadata":{"result_type":"recent"},"to_user_id":null,"text":"streams 0.4, added by EdwardKmett: Various Haskell 2010 stream comonads http://bit.ly/idBkPe","id":30112191881420800,"from_user_id":17489366,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"8530482","profile_image_url":"http://a2.twimg.com/profile_images/137867266/n608671563_7396_normal.jpg","created_at":"Wed, 26 Jan 2011 03:50:12 +0000","from_user":"jeffmclamb","id_str":"30110229207187456","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Angel - daemon to run and monitor processes like daemontools or god, written in Haskell http://ff.im/-wNyLk","id":30110229207187456,"from_user_id":8530482,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://friendfeed.com&quot; rel=&quot;nofollow&quot;&gt;FriendFeed&lt;/a&gt;"},{"from_user_id_str":"177539201","profile_image_url":"http://a0.twimg.com/profile_images/1178368800/img_normal.jpeg","created_at":"Wed, 26 Jan 2011 03:46:01 +0000","from_user":"tomheon","id_str":"30109174645919744","metadata":{"result_type":"recent"},"to_user_id":1594784,"text":"@ojrac @chewedwire Don't worry, learning Haskell will not give you any clear idea what monad means.","id":30109174645919744,"from_user_id":177539201,"to_user":"ojrac","geo":null,"iso_language_code":"en","to_user_id_str":"1594784","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"1594784","profile_image_url":"http://a2.twimg.com/profile_images/378515773/square-profile_normal.jpg","created_at":"Wed, 26 Jan 2011 03:44:34 +0000","from_user":"ojrac","id_str":"30108808684503040","metadata":{"result_type":"recent"},"to_user_id":128028225,"text":"@chewedwire @tomheon Why are you making me curious about Haskell? I LIKE not knowing what monad means!!","id":30108808684503040,"from_user_id":1594784,"to_user":"chewedwire","geo":null,"iso_language_code":"en","to_user_id_str":"128028225","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"23750094","profile_image_url":"http://a0.twimg.com/profile_images/951373780/Moeinthecar_normal.jpg","created_at":"Wed, 26 Jan 2011 03:41:54 +0000","from_user":"shokalshab","id_str":"30108140443795456","metadata":{"result_type":"recent"},"to_user_id":null,"text":"I'm at Magnitude Cheer @ Gymnastics Olympica USA (7735 Haskell Ave., btw Saticoy &amp; Strathern, Van Nuys) http://4sq.com/gmXfaL","id":30108140443795456,"from_user_id":23750094,"geo":null,"iso_language_code":"en","place":{"id":"4e4a2a2f86cb2946","type_":"poi","full_name":"Gymnastics Olympica USA, Van Nuys"},"to_user_id_str":null,"source":"&lt;a href=&quot;http://foursquare.com&quot; rel=&quot;nofollow&quot;&gt;foursquare&lt;/a&gt;"},{"from_user_id_str":"8135112","profile_image_url":"http://a0.twimg.com/profile_images/1165240350/LIMITED_normal.jpg","created_at":"Wed, 26 Jan 2011 03:41:35 +0000","from_user":"Claricei","id_str":"30108059208515584","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @kristenmchugh22: @KeithOlbermann Ryan looks like Jughead w/o the hat. And sounds as mealy-mouthed as Eddie Haskell.","id":30108059208515584,"from_user_id":8135112,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"128028225","profile_image_url":"http://a1.twimg.com/profile_images/1224994593/Coding_Drunk_normal.jpg","created_at":"Wed, 26 Jan 2011 03:40:02 +0000","from_user":"chewedwire","id_str":"30107670367182848","metadata":{"result_type":"recent"},"to_user_id":177539201,"text":"@tomheon Cool, I'll take a look. I feel like I should mention this: http://bit.ly/hVstDM","id":30107670367182848,"from_user_id":128028225,"to_user":"tomheon","geo":null,"iso_language_code":"en","to_user_id_str":"177539201","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"8679778","profile_image_url":"http://a3.twimg.com/profile_images/1195318056/me_nyc_12_18_10_icon_normal.jpg","created_at":"Wed, 26 Jan 2011 03:38:42 +0000","from_user":"kristenmchugh22","id_str":"30107332381777920","metadata":{"result_type":"recent"},"to_user_id":756269,"text":"@KeithOlbermann Ryan looks like Jughead w/o the hat. And sounds as mealy-mouthed as Eddie Haskell.","id":30107332381777920,"from_user_id":8679778,"to_user":"KeithOlbermann","geo":null,"iso_language_code":"en","to_user_id_str":"756269","source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"103316559","profile_image_url":"http://a1.twimg.com/profile_images/1179458751/bc3beab4-d59d-4e78-b13b-50747986cfa2_normal.png","created_at":"Wed, 26 Jan 2011 03:36:15 +0000","from_user":"cityslikr","id_str":"30106719153557504","metadata":{"result_type":"recent"},"to_user_id":null,"text":"&quot;Social safety net into a hammock.&quot; So says Eddie Haskell with the GOP response. #SOTU","id":30106719153557504,"from_user_id":103316559,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://blackberry.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Twitter for BlackBerry\u00ae&lt;/a&gt;"},{"from_user_id_str":"169063143","profile_image_url":"http://a0.twimg.com/profile_images/1160506212/9697_1_normal.gif","created_at":"Wed, 26 Jan 2011 03:31:52 +0000","from_user":"wrkforce_safety","id_str":"30105614919143424","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Federal investigation finds safety violations at The Acadia Hospital: By Meg Haskell, BDN Staff The investigatio... http://bit.ly/gA60C1","id":30105614919143424,"from_user_id":169063143,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"177539201","profile_image_url":"http://a0.twimg.com/profile_images/1178368800/img_normal.jpeg","created_at":"Wed, 26 Jan 2011 03:29:40 +0000","from_user":"tomheon","id_str":"30105060960632832","metadata":{"result_type":"recent"},"to_user_id":128028225,"text":"@chewedwire Great book on Haskell: http://oreilly.com/catalog/9780596514983","id":30105060960632832,"from_user_id":177539201,"to_user":"chewedwire","geo":null,"iso_language_code":"en","to_user_id_str":"128028225","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"782692","profile_image_url":"http://a0.twimg.com/profile_images/1031304589/Profile.2007.1_normal.jpg","created_at":"Wed, 26 Jan 2011 03:29:19 +0000","from_user":"turnageb","id_str":"30104974591533057","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @ovillalon: Paul Ryan solves the mystery of whatever happened to Eddie Haskell. #sotu","id":30104974591533057,"from_user_id":782692,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"128028225","profile_image_url":"http://a1.twimg.com/profile_images/1224994593/Coding_Drunk_normal.jpg","created_at":"Wed, 26 Jan 2011 03:28:04 +0000","from_user":"chewedwire","id_str":"30104657267265536","metadata":{"result_type":"recent"},"to_user_id":177539201,"text":"@tomheon I always loved the pattern matching in SML and it looks like Haskell is MUCH better at it. I'm messing around now at tryhaskell.org","id":30104657267265536,"from_user_id":128028225,"to_user":"tomheon","geo":null,"iso_language_code":"en","to_user_id_str":"177539201","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"12834082","profile_image_url":"http://a3.twimg.com/profile_images/1083036140/mugshot_normal.png","created_at":"Wed, 26 Jan 2011 03:28:01 +0000","from_user":"ovillalon","id_str":"30104647213518848","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Paul Ryan solves the mystery of whatever happened to Eddie Haskell. #sotu","id":30104647213518848,"from_user_id":12834082,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"13540930","profile_image_url":"http://a1.twimg.com/profile_images/1205312219/23467_350321383101_821143101_5114147_3010041_n_normal.jpg","created_at":"Wed, 26 Jan 2011 03:26:02 +0000","from_user":"goodfox","id_str":"30104146455560192","metadata":{"result_type":"recent"},"to_user_id":10226179,"text":"@billykeene22 Bordeaux is one of my heroes. I was so excited when he accepted the invitation to campus. He's been a great friend to Haskell.","id":30104146455560192,"from_user_id":13540930,"to_user":"billykeene22","geo":null,"iso_language_code":"en","to_user_id_str":"10226179","source":"&lt;a href=&quot;http://www.ubertwitter.com/bb/download.php&quot; rel=&quot;nofollow&quot;&gt;\u00dcberTwitter&lt;/a&gt;"},{"from_user_id_str":"18616016","profile_image_url":"http://a2.twimg.com/profile_images/1173522726/214397343_normal.jpg","created_at":"Wed, 26 Jan 2011 03:25:18 +0000","from_user":"josej30","id_str":"30103962313031681","metadata":{"result_type":"recent"},"to_user_id":14870909,"text":"@cris7ian Ahh bueno multiparadigma ya es respetable :) Empezar\u00e9 a explotar la parte funcional de los lenguajes ahora #Haskell","id":30103962313031681,"from_user_id":18616016,"to_user":"Cris7ian","geo":null,"iso_language_code":"es","to_user_id_str":"14870909","source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"14870909","profile_image_url":"http://a2.twimg.com/profile_images/1176930429/oso_yo_normal.png","created_at":"Wed, 26 Jan 2011 03:23:43 +0000","from_user":"Cris7ian","id_str":"30103562360983553","metadata":{"result_type":"recent"},"to_user_id":18616016,"text":"@josej30 hahaha no, es multiparadigma y es bastante lazy. Nothing like haskell, pero s\u00ed, el de Flash","id":30103562360983553,"from_user_id":14870909,"to_user":"josej30","geo":null,"iso_language_code":"es","to_user_id_str":"18616016","source":"&lt;a href=&quot;http://www.echofon.com/&quot; rel=&quot;nofollow&quot;&gt;Echofon&lt;/a&gt;"},{"from_user_id_str":"2421643","profile_image_url":"http://a0.twimg.com/profile_images/1190361665/ernestgrumbles-17_normal.jpg","created_at":"Wed, 26 Jan 2011 03:20:24 +0000","from_user":"ernestgrumbles","id_str":"30102730756333568","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Wow... WolframAlpha did not know who Eddie Haskell is.  Guess I'll never use that &quot;knowledge engine&quot; again.","id":30102730756333568,"from_user_id":2421643,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"128028225","profile_image_url":"http://a1.twimg.com/profile_images/1224994593/Coding_Drunk_normal.jpg","created_at":"Wed, 26 Jan 2011 03:14:21 +0000","from_user":"chewedwire","id_str":"30101204428132352","metadata":{"result_type":"recent"},"to_user_id":177539201,"text":"@tomheon How is Haskell better/different from CL or Scheme? I honestly don't know, although I'm becoming more curious.","id":30101204428132352,"from_user_id":128028225,"to_user":"tomheon","geo":null,"iso_language_code":"en","to_user_id_str":"177539201","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"13540930","profile_image_url":"http://a1.twimg.com/profile_images/1205312219/23467_350321383101_821143101_5114147_3010041_n_normal.jpg","created_at":"Wed, 26 Jan 2011 03:06:54 +0000","from_user":"goodfox","id_str":"30099329809129473","metadata":{"result_type":"recent"},"to_user_id":null,"text":"A day of vision &amp; speeches. #SOTU now. And a wonderful Haskell Convocation address earlier today by Sinte Gleske President Lionel Bordeaux.","id":30099329809129473,"from_user_id":13540930,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.ubertwitter.com/bb/download.php&quot; rel=&quot;nofollow&quot;&gt;\u00dcberTwitter&lt;/a&gt;"},{"from_user_id_str":"119185220","profile_image_url":"http://a0.twimg.com/profile_images/1089027228/dfg_normal.jpg","created_at":"Wed, 26 Jan 2011 03:03:38 +0000","from_user":"LaLiciouz_03","id_str":"30098510623805440","metadata":{"result_type":"recent"},"to_user_id":null,"text":"The Game with the girl room 330 Haskell follow us...","id":30098510623805440,"from_user_id":119185220,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"18616016","profile_image_url":"http://a2.twimg.com/profile_images/1173522726/214397343_normal.jpg","created_at":"Wed, 26 Jan 2011 02:57:25 +0000","from_user":"josej30","id_str":"30096946144215040","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Voy a extra\u00f1ar Haskell cuando regrese al mundo imperativo. Hay alg\u00fan lenguaje imperativo que tenga este poder funcional? #ci3661","id":30096946144215040,"from_user_id":18616016,"geo":null,"iso_language_code":"es","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"17671137","profile_image_url":"http://a2.twimg.com/profile_images/290264834/Haskell-logo-outer-glow_normal.png","created_at":"Wed, 26 Jan 2011 02:55:32 +0000","from_user":"Hackage","id_str":"30096471814574080","metadata":{"result_type":"recent"},"to_user_id":null,"text":"comonad-transformers 0.9.0, added by EdwardKmett: Haskell 98 comonad transformers http://bit.ly/h6xIsf","id":30096471814574080,"from_user_id":17671137,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"177539201","profile_image_url":"http://a0.twimg.com/profile_images/1178368800/img_normal.jpeg","created_at":"Wed, 26 Jan 2011 02:48:12 +0000","from_user":"tomheon","id_str":"30094626920603649","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Every time I look at Haskell I love it more.","id":30094626920603649,"from_user_id":177539201,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"60792568","profile_image_url":"http://a0.twimg.com/profile_images/1203647517/glenda-flash_normal.jpg","created_at":"Wed, 26 Jan 2011 02:40:42 +0000","from_user":"r_takaishi","id_str":"30092735935422464","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Haskell\u3088\u308aD\u8a00\u8a9e\u304c\u4e0a\u3068\u306f\u601d\u308f\u306a\u304b\u3063\u305f\uff0e http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html","id":30092735935422464,"from_user_id":60792568,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://twmode.sf.net/&quot; rel=&quot;nofollow&quot;&gt;twmode&lt;/a&gt;"},{"from_user_id_str":"160145510","profile_image_url":"http://a0.twimg.com/profile_images/1218108166/going_galt_normal.jpg","created_at":"Wed, 26 Jan 2011 02:39:31 +0000","from_user":"wtp1787","id_str":"30092439653974018","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @KLSouth: Eddie Haskell Goes to Washington...  &quot;You look really nice tonight, Ms Cleaver&quot;","id":30092439653974018,"from_user_id":160145510,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"96616016","profile_image_url":"http://a1.twimg.com/profile_images/1196978169/Picture0002_normal.jpg","created_at":"Wed, 26 Jan 2011 02:39:20 +0000","from_user":"MelissaRNMBA","id_str":"30092392203816960","metadata":{"result_type":"recent"},"to_user_id":14862975,"text":"@KLSouth At least Eddie Haskell was entertaining.","id":30092392203816960,"from_user_id":96616016,"to_user":"KLSouth","geo":null,"iso_language_code":"en","to_user_id_str":"14862975","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"14862975","profile_image_url":"http://a0.twimg.com/profile_images/421596393/kls_4_normal.JPG","created_at":"Wed, 26 Jan 2011 02:38:29 +0000","from_user":"KLSouth","id_str":"30092178327871489","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Eddie Haskell Goes to Washington...  &quot;You look really nice tonight, Ms Cleaver&quot;","id":30092178327871489,"from_user_id":14862975,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"144546280","profile_image_url":"http://a1.twimg.com/a/1295051201/images/default_profile_1_normal.png","created_at":"Wed, 26 Jan 2011 02:36:17 +0000","from_user":"listwarenet","id_str":"30091626869161984","metadata":{"result_type":"recent"},"to_user_id":null,"text":"http://www.listware.net/201101/haskell-beginners/84641-haskell-beginners-wildcards-in-expressions.html Haskell-beginners -  Wild","id":30091626869161984,"from_user_id":144546280,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://1e10.org/cloud/&quot; rel=&quot;nofollow&quot;&gt;1e10&lt;/a&gt;"},{"from_user_id_str":"24538048","profile_image_url":"http://a2.twimg.com/profile_images/1117267605/rope_normal.jpg","created_at":"Wed, 26 Jan 2011 02:23:14 +0000","from_user":"dbph","id_str":"30088341030440960","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @dnene: Skilled Calisthenics. Haskell code that outputs python which spits ruby which emits the haskell source. http://j.mp/YlQUL via @mfeathers","id":30088341030440960,"from_user_id":24538048,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"158951567","profile_image_url":"http://a3.twimg.com/profile_images/962721419/Logo_3_normal.jpg","created_at":"Wed, 26 Jan 2011 01:58:31 +0000","from_user":"YubaVetTech","id_str":"30082124207886336","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Dr. Haskell has just been awarded the prestigious Hayward Award for \u2018Excellence in Education\u2019. This award honors... http://fb.me/QgQCxd74","id":30082124207886336,"from_user_id":158951567,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.facebook.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Facebook&lt;/a&gt;"},{"from_user_id_str":"158951567","profile_image_url":"http://a3.twimg.com/profile_images/962721419/Logo_3_normal.jpg","created_at":"Wed, 26 Jan 2011 01:56:04 +0000","from_user":"YubaVetTech","id_str":"30081505476743168","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Dr. Haskell has just been awarded the prestigous Haward Award for Excellence in Education. This award honors... http://fb.me/PC9mYmCR","id":30081505476743168,"from_user_id":158951567,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.facebook.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Facebook&lt;/a&gt;"},{"from_user_id_str":"2331498","profile_image_url":"http://a3.twimg.com/profile_images/494632120/me_normal.jpg","created_at":"Wed, 26 Jan 2011 01:43:50 +0000","from_user":"Verus","id_str":"30078427155406848","metadata":{"result_type":"recent"},"to_user_id":79273052,"text":"@kami_joe \u3044\u3084\uff0c\u8ab2\u984c\u306f\u89e3\u6c7a\u5bfe\u8c61(\u30d1\u30ba\u30eb\u3068\u304b)\u3092\u4e0e\u3048\u3089\u308c\u3066\uff0c\u554f\u984c\u5b9a\u7fa9\u3068\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0(\u6307\u5b9a\u8a00\u8a9e\u306fC++\u3082\u3057\u304f\u306fJava)\u3068\u3044\u3046\u3044\u308f\u3070\u666e\u901a\u306a\u8ab2\u984c\u3067\u306f\u3042\u308b\u3093\u3060\u3051\u3069\uff0e\u95a2\u6570\u578b\u8a00\u8a9e\u306fHaskell\u306e\u6388\u696d\u304c\u307e\u305f\u5225\u306b\u3042\u308b\u306e\uff0e","id":30078427155406848,"from_user_id":2331498,"to_user":"kami_joe","geo":null,"iso_language_code":"ja","to_user_id_str":"79273052","source":"&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"},{"from_user_id_str":"79151233","profile_image_url":"http://a2.twimg.com/a/1295051201/images/default_profile_2_normal.png","created_at":"Wed, 26 Jan 2011 01:40:37 +0000","from_user":"cz_newdrafts","id_str":"30077617361125376","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Haskell programming language http://bit.ly/gpPAwB","id":30077617361125376,"from_user_id":79151233,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://tommorris.org/&quot; rel=&quot;nofollow&quot;&gt;tommorris' hacksample&lt;/a&gt;"},{"from_user_id_str":"2331498","profile_image_url":"http://a3.twimg.com/profile_images/494632120/me_normal.jpg","created_at":"Wed, 26 Jan 2011 01:02:57 +0000","from_user":"Verus","id_str":"30068139416879104","metadata":{"result_type":"recent"},"to_user_id":9252720,"text":"@shukukei Java\u3068C\u306f\u3042\u308b\u7a0b\u5ea6\u66f8\u3051\u3066\u3042\u305f\u308a\u307e\u3048\u306a\u3068\u3053\u308d\u304c\u3042\u308b\u304b\u3089\u306a\u30fc\uff0ePython\u306f\u500b\u4eba\u7684\u306b\u611f\u899a\u304c\u5408\u308f\u306a\u3044\uff0e\u611f\u899a\u306a\u306e\u3067\uff0c\u3082\u3046\u3069\u3046\u3057\u3088\u3046\u3082\u306a\u3044\uff57 \u3044\u307e\u306fScala\u3068Haskell\u3092\u3082\u3063\u3068\u6975\u3081\u305f\u3044\u3068\u3053\u308d\uff0e","id":30068139416879104,"from_user_id":2331498,"to_user":"shukukei","geo":null,"iso_language_code":"ja","to_user_id_str":"9252720","source":"&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"},{"from_user_id_str":"2781460","profile_image_url":"http://a0.twimg.com/profile_images/82526625/.joeyicon_normal.jpg","created_at":"Wed, 26 Jan 2011 01:02:35 +0000","from_user":"joeyhess","id_str":"30068046538219520","metadata":{"result_type":"recent"},"to_user_id":null,"text":"just figured out that I can use parameterized types to remove a dependency loop in git-annex's type definitions. whee #haskell","id":30068046538219520,"from_user_id":2781460,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://identi.ca&quot; rel=&quot;nofollow&quot;&gt;identica&lt;/a&gt;"},{"from_user_id_str":"144546280","profile_image_url":"http://a1.twimg.com/a/1295051201/images/default_profile_1_normal.png","created_at":"Wed, 26 Jan 2011 00:54:22 +0000","from_user":"listwarenet","id_str":"30065977920061440","metadata":{"result_type":"recent"},"to_user_id":null,"text":"http://www.listware.net/201101/haskell-beginners/84466-haskell-beginners-bytestring-question.html Haskell-beginners -  Bytestrin","id":30065977920061440,"from_user_id":144546280,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://1e10.org/cloud/&quot; rel=&quot;nofollow&quot;&gt;1e10&lt;/a&gt;"},{"from_user_id_str":"1291845","profile_image_url":"http://a0.twimg.com/profile_images/1225743404/ThinOxygen-small-opaque-solidarity_normal.png","created_at":"Wed, 26 Jan 2011 00:52:07 +0000","from_user":"_aaron_","id_str":"30065412242669568","metadata":{"result_type":"recent"},"to_user_id":null,"text":"wanted: librly licensed high level native compiled lang with min runtime (otherwise cobra/mono would be perfect) for win. lua? haskell? ooc?","id":30065412242669568,"from_user_id":1291845,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"5912444","profile_image_url":"http://a2.twimg.com/profile_images/546261026/ssf0xg11_normal.jpg","created_at":"Wed, 26 Jan 2011 00:45:45 +0000","from_user":"shelarcy","id_str":"30063810773516288","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @Hackage: download 0.3.1.1, added by MagnusTherning: High-level file download based on URLs http://bit.ly/eHfiJB","id":30063810773516288,"from_user_id":5912444,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"135993","profile_image_url":"http://a2.twimg.com/profile_images/1190667086/myface2010small_normal.jpg","created_at":"Wed, 26 Jan 2011 00:41:00 +0000","from_user":"kudzu_naoki","id_str":"30062613287141376","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @tanakh: \u9b54\u6cd5Haskell\u5c11\u5973\u5019\u88dc\u3092\u63a2\u3059\u306e\u3082\u5927\u5909\u306a\u3093\u3060","id":30062613287141376,"from_user_id":135993,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.hootsuite.com&quot; rel=&quot;nofollow&quot;&gt;HootSuite&lt;/a&gt;"},{"from_user_id_str":"52620546","profile_image_url":"http://a1.twimg.com/profile_images/434693356/twitter-icon_normal.png","created_at":"Wed, 26 Jan 2011 00:40:25 +0000","from_user":"omasanori","id_str":"30062465656033280","metadata":{"result_type":"recent"},"to_user_id":null,"text":"\u9b54\u6cd5Haskell\u5c11\u5973\u306e\u4e00\u65e5\u306fGHC HEAD\u306e\u30d3\u30eb\u30c9\u304b\u3089\u59cb\u307e\u308b","id":30062465656033280,"from_user_id":52620546,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.movatwi.jp&quot; rel=&quot;nofollow&quot;&gt;www.movatwi.jp&lt;/a&gt;"},{"from_user_id_str":"52620546","profile_image_url":"http://a1.twimg.com/profile_images/434693356/twitter-icon_normal.png","created_at":"Wed, 26 Jan 2011 00:37:12 +0000","from_user":"omasanori","id_str":"30061656331526144","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @tanakh: \u50d5\u3068\u5951\u7d04\u3057\u3066\u9b54\u6cd5Haskell\u5c11\u5973\u306b\u306a\u308d\u3046\u3088\uff01","id":30061656331526144,"from_user_id":52620546,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.hootsuite.com&quot; rel=&quot;nofollow&quot;&gt;HootSuite&lt;/a&gt;"},{"from_user_id_str":"135993","profile_image_url":"http://a2.twimg.com/profile_images/1190667086/myface2010small_normal.jpg","created_at":"Wed, 26 Jan 2011 00:35:42 +0000","from_user":"kudzu_naoki","id_str":"30061282665168896","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @tanakh: \u50d5\u3068\u5951\u7d04\u3057\u3066\u9b54\u6cd5Haskell\u5c11\u5973\u306b\u306a\u308d\u3046\u3088\uff01","id":30061282665168896,"from_user_id":135993,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.hootsuite.com&quot; rel=&quot;nofollow&quot;&gt;HootSuite&lt;/a&gt;"},{"from_user_id_str":"1631333","profile_image_url":"http://a1.twimg.com/profile_images/81268862/profile300_normal.jpg","created_at":"Wed, 26 Jan 2011 00:30:02 +0000","from_user":"qnighy","id_str":"30059855884582913","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @tanakh: \u50d5\u3068\u5951\u7d04\u3057\u3066\u9b54\u6cd5Haskell\u5c11\u5973\u306b\u306a\u308d\u3046\u3088\uff01","id":30059855884582913,"from_user_id":1631333,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.hootsuite.com&quot; rel=&quot;nofollow&quot;&gt;HootSuite&lt;/a&gt;"},{"from_user_id_str":"9093754","profile_image_url":"http://a1.twimg.com/profile_images/99435906/PHD_3d_col_blk_normal.jpg","created_at":"Wed, 26 Jan 2011 00:26:20 +0000","from_user":"phdwine","id_str":"30058925516656640","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Last weekend of Tri Nations Tasting with PHD wines at Haskell Vineyards. Hope you didn't miss the Pinot Noir tasting last week !","id":30058925516656640,"from_user_id":9093754,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"2119923","profile_image_url":"http://a2.twimg.com/profile_images/1096701078/djayprofile_normal.jpg","created_at":"Wed, 26 Jan 2011 00:21:14 +0000","from_user":"djay75","id_str":"30057639543050240","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @dnene: Skilled Calisthenics. Haskell code that outputs python which spits ruby which emits the haskell source. http://j.mp/YlQUL via @mfeathers","id":30057639543050240,"from_user_id":2119923,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"134323731","profile_image_url":"http://a2.twimg.com/profile_images/1225818824/IMG00518-20110125-1547_normal.jpg","created_at":"Wed, 26 Jan 2011 00:19:30 +0000","from_user":"PrinceOfBrkeley","id_str":"30057205554216960","metadata":{"result_type":"recent"},"to_user_id":167093027,"text":"@PayThaPrince go to haskell.","id":30057205554216960,"from_user_id":134323731,"to_user":"PayThaPrince","geo":null,"iso_language_code":"en","to_user_id_str":"167093027","source":"&lt;a href=&quot;http://blackberry.com/twitter&quot; rel=&quot;nofollow&quot;&gt;Twitter for BlackBerry\u00ae&lt;/a&gt;"},{"from_user_id_str":"705857","profile_image_url":"http://a1.twimg.com/profile_images/429483912/ben_twitter_normal.jpg","created_at":"Wed, 26 Jan 2011 00:03:28 +0000","from_user":"bennadel","id_str":"30053166972141569","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Using #Homebrew to install Haskell - the last of the Seven Languages (in Seven Weeks) http://bit.ly/eA9Cv1 This has been some journey.","id":30053166972141569,"from_user_id":705857,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"251466","profile_image_url":"http://a2.twimg.com/profile_images/1194100934/pass_normal.jpg","created_at":"Wed, 26 Jan 2011 00:02:54 +0000","from_user":"simonszu","id_str":"30053025502466048","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Ouh yeah! Ich werde doch produktiv sein, diese Semesterferien. Ich werde funktional Programmieren lernen. #haskell, Baby.","id":30053025502466048,"from_user_id":251466,"geo":null,"iso_language_code":"de","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.echofon.com/&quot; rel=&quot;nofollow&quot;&gt;Echofon&lt;/a&gt;"},{"from_user_id_str":"357786","profile_image_url":"http://a0.twimg.com/profile_images/612044841/FM_2010_normal.jpg","created_at":"Tue, 25 Jan 2011 23:59:13 +0000","from_user":"diligiant","id_str":"30052100973006848","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @paulrbrown: &quot;...we only discovered a single bug after compilation.&quot; (http://t.co/K0wlEYz) #haskell","id":30052100973006848,"from_user_id":357786,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"},{"from_user_id_str":"101597523","profile_image_url":"http://a1.twimg.com/profile_images/1206183256/2010-12-12-204902_normal.jpg","created_at":"Tue, 25 Jan 2011 23:54:46 +0000","from_user":"wlad_kent","id_str":"30050977964892160","metadata":{"result_type":"recent"},"to_user_id":86297184,"text":"@Nilson_Neto Isso eh bem basico. quando vc estiver estudando recurs\u00e3o em Haskell, ai vc vai ver oq eh papo de nerd - kkk - 1\u00ba periodo isso.","id":30050977964892160,"from_user_id":101597523,"to_user":"Nilson_Neto","geo":null,"iso_language_code":"pt","to_user_id_str":"86297184","source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"144546280","profile_image_url":"http://a1.twimg.com/a/1295051201/images/default_profile_1_normal.png","created_at":"Tue, 25 Jan 2011 23:51:22 +0000","from_user":"listwarenet","id_str":"30050123383832577","metadata":{"result_type":"recent"},"to_user_id":null,"text":"http://www.listware.net/201101/haskell-cafe/84336-haskell-cafe-monomorphic-let-bindings-and-darcs.html Haskell-cafe -  Monomorph","id":30050123383832577,"from_user_id":144546280,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://1e10.org/cloud/&quot; rel=&quot;nofollow&quot;&gt;1e10&lt;/a&gt;"},{"from_user_id_str":"5776901","profile_image_url":"http://a0.twimg.com/profile_images/472682157/lucabw_normal.JPG","created_at":"Tue, 25 Jan 2011 23:48:40 +0000","from_user":"lsbardel","id_str":"30049446469312512","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Very interesting technology stack these guys use http://bit.ly/ghAjS7 #python #redis #haskell","id":30049446469312512,"from_user_id":5776901,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"3005901","profile_image_url":"http://a0.twimg.com/profile_images/278943006/Lone_Pine_Peak_-_Peter_200x200_normal.jpg","created_at":"Tue, 25 Jan 2011 23:45:48 +0000","from_user":"pmonks","id_str":"30048721110573056","metadata":{"result_type":"recent"},"to_user_id":203834278,"text":"@techielicous Haskell: http://bit.ly/gy3oFi  ;-)","id":30048721110573056,"from_user_id":3005901,"to_user":"techielicous","geo":null,"iso_language_code":"en","to_user_id_str":"203834278","source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"162697074","profile_image_url":"http://a2.twimg.com/profile_images/826205838/ryan3_normal.jpg","created_at":"Tue, 25 Jan 2011 23:44:47 +0000","from_user":"TheRonaldMCD","id_str":"30048468781244416","metadata":{"result_type":"recent"},"to_user_id":null,"text":"I'm at Aldi Food Market (4122 Gaston Ave, Haskell, Dallas) http://4sq.com/ekqRY7","id":30048468781244416,"from_user_id":162697074,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://foursquare.com&quot; rel=&quot;nofollow&quot;&gt;foursquare&lt;/a&gt;"},{"from_user_id_str":"203834278","profile_image_url":"http://a0.twimg.com/profile_images/1223375080/me_normal.jpg","created_at":"Tue, 25 Jan 2011 23:44:04 +0000","from_user":"techielicous","id_str":"30048286589067264","metadata":{"result_type":"recent"},"to_user_id":3005901,"text":"@pmonks I was thinking Haskell or Scheme","id":30048286589067264,"from_user_id":203834278,"to_user":"pmonks","geo":null,"iso_language_code":"en","to_user_id_str":"3005901","source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"537690","profile_image_url":"http://a3.twimg.com/profile_images/45665122/nushiostamp_normal.jpg","created_at":"Tue, 25 Jan 2011 23:38:14 +0000","from_user":"nushio","id_str":"30046818658164737","metadata":{"result_type":"recent"},"to_user_id":null,"text":"\u305d\u3046\u3044\u3084\u5951\u7d04\u306b\u3088\u308b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3068\u304b\u3042\u3063\u305f\u306a\u3002Haskell\u306a\u3093\u304b\u3088\u308a\u3042\u3063\u3061\u306e\u65b9\u304c\u9b54\u6cd5\u5c11\u5973\u547c\u3070\u308f\u308a\u306b\u3075\u3055\u308f\u3057\u3044\u3002","id":30046818658164737,"from_user_id":537690,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"181192","profile_image_url":"http://a2.twimg.com/profile_images/1089890701/q530888600_9828_normal.jpg","created_at":"Tue, 25 Jan 2011 23:38:03 +0000","from_user":"aodag","id_str":"30046772223016960","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @omasanori: \u300c\u3082\u3046\u4f55\u5e74\u3082Haskell\u306e\u3053\u3068\u3057\u304b\u8003\u3048\u3066\u306a\u304b\u3063\u305f\u304b\u3089\u306a\u3001\u30eb\u30fc\u30d7\u306e\u4f7f\u3044\u65b9\u5fd8\u308c\u3066\u305f\u300d","id":30046772223016960,"from_user_id":181192,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.movatwi.jp&quot; rel=&quot;nofollow&quot;&gt;www.movatwi.jp&lt;/a&gt;"},{"from_user_id_str":"5886055","profile_image_url":"http://a3.twimg.com/profile_images/85531669/ichi_normal.jpg","created_at":"Tue, 25 Jan 2011 23:37:53 +0000","from_user":"kanaya","id_str":"30046729243983873","metadata":{"result_type":"recent"},"to_user_id":null,"text":"\u9e97\u3057\u3044\u3002\u201c@omasanori: \u300c\u3082\u3046\u4f55\u5e74\u3082Haskell\u306e\u3053\u3068\u3057\u304b\u8003\u3048\u3066\u306a\u304b\u3063\u305f\u304b\u3089\u306a\u3001\u30eb\u30fc\u30d7\u306e\u4f7f\u3044\u65b9\u5fd8\u308c\u3066\u305f\u300d\u201d","id":30046729243983873,"from_user_id":5886055,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://itunes.apple.com/app/twitter/id333903271?mt=8&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPad&lt;/a&gt;"},{"from_user_id_str":"52620546","profile_image_url":"http://a1.twimg.com/profile_images/434693356/twitter-icon_normal.png","created_at":"Tue, 25 Jan 2011 23:36:26 +0000","from_user":"omasanori","id_str":"30046367187476481","metadata":{"result_type":"recent"},"to_user_id":null,"text":"\u300c\u3082\u3046\u4f55\u5e74\u3082Haskell\u306e\u3053\u3068\u3057\u304b\u8003\u3048\u3066\u306a\u304b\u3063\u305f\u304b\u3089\u306a\u3001\u30eb\u30fc\u30d7\u306e\u4f7f\u3044\u65b9\u5fd8\u308c\u3066\u305f\u300d","id":30046367187476481,"from_user_id":52620546,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.movatwi.jp&quot; rel=&quot;nofollow&quot;&gt;www.movatwi.jp&lt;/a&gt;"},{"from_user_id_str":"1659992","profile_image_url":"http://a1.twimg.com/profile_images/504488750/1_normal.jpg","created_at":"Tue, 25 Jan 2011 23:16:13 +0000","from_user":"finalfusion","id_str":"30041278544609280","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @necocen: Haskell\u306e\u30df\u30b5\u30ef\u3001\u3068\u3044\u3046\u3082\u306e\u3092\u8003\u3048\u3066\u307f\u3066\u3071\u3063\u3068\u3057\u306a\u3044","id":30041278544609280,"from_user_id":1659992,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"},{"from_user_id_str":"272513","profile_image_url":"http://a2.twimg.com/profile_images/320244078/Mike_Painting2_normal.png","created_at":"Tue, 25 Jan 2011 23:05:09 +0000","from_user":"mikehadlow","id_str":"30038492373319680","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Just written the same simple program in C#, F# and Haskell: 18, 12 and 9 LoC respectively. And I'm much better at C# than F# or Haskell.","id":30038492373319680,"from_user_id":272513,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"89393264","profile_image_url":"http://a0.twimg.com/profile_images/1169486472/020_portland_me_normal.jpg","created_at":"Tue, 25 Jan 2011 23:01:28 +0000","from_user":"newsportlandme","id_str":"30037564589084673","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Governor's Choice to Run Maine DOC Under Scrutiny - MPBN: State Rep. Anne Haskell, a Portland Democrat, says Mai... http://bit.ly/fO30gC","id":30037564589084673,"from_user_id":89393264,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"38138","profile_image_url":"http://a3.twimg.com/profile_images/1212565885/Screen_shot_2011-01-11_at_5.28.47_PM_normal.png","created_at":"Tue, 25 Jan 2011 22:59:55 +0000","from_user":"michaelneale","id_str":"30037174615281664","metadata":{"result_type":"recent"},"to_user_id":null,"text":"The haskell EvilMangler http://t.co/P2Tls7J","id":30037174615281664,"from_user_id":38138,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"},{"from_user_id_str":"45692","profile_image_url":"http://a3.twimg.com/profile_images/1177741507/dogkarno_r_normal.jpg","created_at":"Tue, 25 Jan 2011 22:45:06 +0000","from_user":"karno","id_str":"30033448286552064","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Haskell\u3063\u3066\u95a2\u6570\u306b\u30ab\u30ec\u30fc\u7c89\u3076\u3061\u8fbc\u3080\u3068\u304b\u306a\u3093\u3068\u304b","id":30033448286552064,"from_user_id":45692,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://yubitter.com/&quot; rel=&quot;nofollow&quot;&gt;yubitter&lt;/a&gt;"},{"from_user_id_str":"27605","profile_image_url":"http://a2.twimg.com/profile_images/15826632/meron_normal.jpg","created_at":"Tue, 25 Jan 2011 22:44:23 +0000","from_user":"celeron1ghz","id_str":"30033268761956352","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @necocen: Haskell\u306e\u30df\u30b5\u30ef\u3001\u3068\u3044\u3046\u3082\u306e\u3092\u8003\u3048\u3066\u307f\u3066\u3071\u3063\u3068\u3057\u306a\u3044","id":30033268761956352,"from_user_id":27605,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"},{"from_user_id_str":"12901","profile_image_url":"http://a1.twimg.com/profile_images/56091349/haruhi_nagato-Y_normal.jpg","created_at":"Tue, 25 Jan 2011 22:43:30 +0000","from_user":"necocen","id_str":"30033044035346432","metadata":{"result_type":"recent"},"to_user_id":null,"text":"\u307e\u3042Haskell\u77e5\u3089\u3093\u3057\u306d","id":30033044035346432,"from_user_id":12901,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"},{"from_user_id_str":"12901","profile_image_url":"http://a1.twimg.com/profile_images/56091349/haruhi_nagato-Y_normal.jpg","created_at":"Tue, 25 Jan 2011 22:42:54 +0000","from_user":"necocen","id_str":"30032894856531968","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Haskell\u306e\u30df\u30b5\u30ef\u3001\u3068\u3044\u3046\u3082\u306e\u3092\u8003\u3048\u3066\u307f\u3066\u3071\u3063\u3068\u3057\u306a\u3044","id":30032894856531968,"from_user_id":12901,"geo":null,"iso_language_code":"ja","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"},{"from_user_id_str":"10821270","profile_image_url":"http://a0.twimg.com/profile_images/1195474259/Salto_Marlon_normal.jpg","created_at":"Tue, 25 Jan 2011 22:35:09 +0000","from_user":"jjedMoriAnktah","id_str":"30030942106025984","metadata":{"result_type":"recent"},"to_user_id":null,"text":"&quot;A Haskell program that outputs a Python program that outputs a Ruby program that outputs the original Haskell program&quot; http://is.gd/E6Julu","id":30030942106025984,"from_user_id":10821270,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://www.tweetdeck.com&quot; rel=&quot;nofollow&quot;&gt;TweetDeck&lt;/a&gt;"},{"from_user_id_str":"7554762","profile_image_url":"http://a0.twimg.com/profile_images/100515212/ajay-photo_normal.jpg","created_at":"Tue, 25 Jan 2011 22:34:30 +0000","from_user":"comatose_kid","id_str":"30030780205899776","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @bumptech: Bump Dev Blog - Why we use Haskell at Bump http://devblog.bu.mp/haskell-at-bump","id":30030780205899776,"from_user_id":7554762,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"148474705","profile_image_url":"http://a0.twimg.com/profile_images/1119234716/fur_hat_-_gilbeys_vodka_-_life_-_11-30-1962_normal.JPG","created_at":"Tue, 25 Jan 2011 22:29:19 +0000","from_user":"landmvintage","id_str":"30029476003840000","metadata":{"result_type":"recent"},"to_user_id":null,"text":"RT @faerymoongodess: Magnificent Miriam Haskell Baroque Pearl Necklace by @MercyMadge http://etsy.me/hqRl51","id":30029476003840000,"from_user_id":148474705,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"37715508","profile_image_url":"http://a1.twimg.com/profile_images/1207891411/ballerina_normal.jpg","created_at":"Tue, 25 Jan 2011 22:24:52 +0000","from_user":"faerymoongodess","id_str":"30028356326002688","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Magnificent Miriam Haskell Baroque Pearl Necklace by @MercyMadge http://etsy.me/hqRl51","id":30028356326002688,"from_user_id":37715508,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"17671137","profile_image_url":"http://a2.twimg.com/profile_images/290264834/Haskell-logo-outer-glow_normal.png","created_at":"Tue, 25 Jan 2011 22:17:16 +0000","from_user":"Hackage","id_str":"30026442456694784","metadata":{"result_type":"recent"},"to_user_id":null,"text":"base16-bytestring 0.1.0.0, added by BryanOSullivan: Fast base16 (hex) encoding and deconding for ByteStrings http://bit.ly/eu75TN","id":30026442456694784,"from_user_id":17671137,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"199750997","profile_image_url":"http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png","created_at":"Tue, 25 Jan 2011 22:12:07 +0000","from_user":"benreads","id_str":"30025146991382528","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Writing Systems Software in a Functional Language -- brief, but fun. I want to see how well they can make Systems Haskell perform at scale.","id":30025146991382528,"from_user_id":199750997,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot;&gt;web&lt;/a&gt;"},{"from_user_id_str":"35359797","profile_image_url":"http://a1.twimg.com/profile_images/1173453785/48893_521140819_1896062_q_normal.jpg","created_at":"Tue, 25 Jan 2011 22:09:45 +0000","from_user":"jcawthorne1","id_str":"30024549265309696","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Just saw Jeff Haskell give the middle finger!! Lol awesome","id":30024549265309696,"from_user_id":35359797,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitter.com/&quot; rel=&quot;nofollow&quot;&gt;Twitter for iPhone&lt;/a&gt;"},{"from_user_id_str":"13540930","profile_image_url":"http://a1.twimg.com/profile_images/1205312219/23467_350321383101_821143101_5114147_3010041_n_normal.jpg","created_at":"Tue, 25 Jan 2011 22:06:44 +0000","from_user":"goodfox","id_str":"30023790381498369","metadata":{"result_type":"recent"},"to_user_id":null,"text":"At the Haskell Convocation. (@ Haskell Indian Nations U Auditorium) http://4sq.com/eKKXyn","id":30023790381498369,"from_user_id":13540930,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://foursquare.com&quot; rel=&quot;nofollow&quot;&gt;foursquare&lt;/a&gt;"},{"from_user_id_str":"14674418","profile_image_url":"http://a2.twimg.com/profile_images/238230125/IMG_1030-1_normal.jpg","created_at":"Tue, 25 Jan 2011 22:02:31 +0000","from_user":"sanityinc","id_str":"30022731919523840","metadata":{"result_type":"recent"},"to_user_id":371289,"text":"@xshay Haskell's great, but Clojure's similarly lazy in all the ways that matter, and is more practical for day-to-day use.","id":30022731919523840,"from_user_id":14674418,"to_user":"xshay","geo":null,"iso_language_code":"en","to_user_id_str":"371289","source":"&lt;a href=&quot;http://www.echofon.com/&quot; rel=&quot;nofollow&quot;&gt;Echofon&lt;/a&gt;"},{"from_user_id_str":"371289","profile_image_url":"http://a2.twimg.com/profile_images/1113482439/me-brisbane_normal.jpg","created_at":"Tue, 25 Jan 2011 21:58:29 +0000","from_user":"xshay","id_str":"30021714444292096","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Just made a lazy sequence of prime numbers in haskell. I'm smitten.","id":30021714444292096,"from_user_id":371289,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://itunes.apple.com/us/app/twitter/id409789998?mt=12&quot; rel=&quot;nofollow&quot;&gt;Twitter for Mac&lt;/a&gt;"},{"from_user_id_str":"199453873","profile_image_url":"http://a3.twimg.com/a/1294785484/images/default_profile_3_normal.png","created_at":"Tue, 25 Jan 2011 21:48:40 +0000","from_user":"stackfeed","id_str":"30019243982454784","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Practical Scala reference manual, for searching things like method names: Hello, \n\nInspired by\nHaskell API Searc... http://bit.ly/g4zWZQ","id":30019243982454784,"from_user_id":199453873,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"17489366","profile_image_url":"http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png","created_at":"Tue, 25 Jan 2011 21:45:32 +0000","from_user":"aapnoot","id_str":"30018455189065728","metadata":{"result_type":"recent"},"to_user_id":null,"text":"download 0.3.1, added by MagnusTherning: High-level file download based on URLs http://bit.ly/i8mYvi","id":30018455189065728,"from_user_id":17489366,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"17489366","profile_image_url":"http://a3.twimg.com/sticky/default_profile_images/default_profile_2_normal.png","created_at":"Tue, 25 Jan 2011 21:45:31 +0000","from_user":"aapnoot","id_str":"30018452601180160","metadata":{"result_type":"recent"},"to_user_id":null,"text":"download 0.3.1.1, added by MagnusTherning: High-level file download based on URLs http://bit.ly/eHfiJB","id":30018452601180160,"from_user_id":17489366,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"17671137","profile_image_url":"http://a2.twimg.com/profile_images/290264834/Haskell-logo-outer-glow_normal.png","created_at":"Tue, 25 Jan 2011 21:45:31 +0000","from_user":"Hackage","id_str":"30018451867176960","metadata":{"result_type":"recent"},"to_user_id":null,"text":"download 0.3.1, added by MagnusTherning: High-level file download based on URLs http://bit.ly/i8mYvi","id":30018451867176960,"from_user_id":17671137,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"138502705","profile_image_url":"http://a1.twimg.com/profile_images/1083845614/yclogo_normal.gif","created_at":"Tue, 25 Jan 2011 21:45:04 +0000","from_user":"newsyc100","id_str":"30018340839755777","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Haskell improves log processing 4x over Python http://devblog.bu.mp/haskell-at-bump (http://bit.ly/gQxxR8)","id":30018340839755777,"from_user_id":138502705,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://news.ycombinator.com&quot; rel=&quot;nofollow&quot;&gt;newsyc&lt;/a&gt;"},{"from_user_id_str":"1578246","profile_image_url":"http://a0.twimg.com/profile_images/59312315/avatar_simpson_small_normal.jpg","created_at":"Tue, 25 Jan 2011 21:43:32 +0000","from_user":"magthe","id_str":"30017953801969665","metadata":{"result_type":"recent"},"to_user_id":null,"text":"New version of download uploaded to #hackage #haskell","id":30017953801969665,"from_user_id":1578246,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://api.supertweet.net&quot; rel=&quot;nofollow&quot;&gt;MyAuth API Proxy&lt;/a&gt;"},{"from_user_id_str":"135838970","profile_image_url":"http://a2.twimg.com/profile_images/1079929891/logo_normal.png","created_at":"Tue, 25 Jan 2011 21:37:51 +0000","from_user":"reward999","id_str":"30016525180084224","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Found Great Dane (Main &amp; Haskell- Dallas): We found a great dane. 214-712-0000 http://bit.ly/fQ8iBw","id":30016525180084224,"from_user_id":135838970,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://twitterfeed.com&quot; rel=&quot;nofollow&quot;&gt;twitterfeed&lt;/a&gt;"},{"from_user_id_str":"137719265","profile_image_url":"http://a2.twimg.com/profile_images/1092224079/8__4__normal.jpg","created_at":"Tue, 25 Jan 2011 21:34:22 +0000","from_user":"WeiMatas","id_str":"30015646020411392","metadata":{"result_type":"recent"},"to_user_id":null,"text":"Fourth day Rez party Eddie Haskell County in second life \u2013 which took place in cabaret Tadd","id":30015646020411392,"from_user_id":137719265,"geo":null,"iso_language_code":"en","to_user_id_str":null,"source":"&lt;a href=&quot;http://dlvr.it&quot; rel=&quot;nofollow&quot;&gt;dlvr.it&lt;/a&gt;"},{"from_user_id_str":"144546280","profile_image_url":"http://a1.twimg.com/a/1295051201/images/default_profile_1_normal.png","created_at":"Tue, 25 Jan 2011 21:33:21 +0000","from_user":"listwarenet","id_str":"30015392571195392","metadata":{"result_type":"recent"},"to_user_id":null,"text":"http://www.listware.net/201101/haskell-cafe/83889-haskell-cafe-gpl-license-of-h-matrix-and-prelude-numeric.html Haskell-cafe -","id":30015392571195392,"from_user_id":144546280,"geo":null,"iso_language_code":"no","to_user_id_str":null,"source":"&lt;a href=&quot;http://1e10.org/cloud/&quot; rel=&quot;nofollow&quot;&gt;1e10&lt;/a&gt;"}],"max_id":30121530767708160,"since_id":0,"refresh_url":"?since_id=30121530767708160&q=haskell","next_page":"?page=2&max_id=30121530767708160&rpp=100&q=haskell","results_per_page":100,"page":1,"completed_in":1.195569,"since_id_str":"0","max_id_str":"30121530767708160","query":"haskell"}
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,212 @@
+module Main where
+
+import Prelude hiding (null, bool)
+import Hedgehog
+import Hedgehog.Main
+import qualified Data.Aeson as A
+import qualified Jsonifier as J
+import qualified Data.HashMap.Strict as HashMap
+import qualified Hedgehog.Gen as Gen
+import qualified Hedgehog.Range as Range
+import qualified Data.ByteString.Char8 as Char8ByteString
+import qualified Data.Vector as Vector
+import qualified Main.Util.HedgehogGens as GenExtras
+
+
+main =
+  defaultMain $ pure $ checkParallel $ $$(discover)
+
+prop_sample =
+  withTests 1 $
+  property $ do
+    sample <- liftIO $ load "samples/twitter100.json"
+    A.eitherDecodeStrict' (J.toByteString (aesonJson sample)) === Right sample
+  where
+    load :: FilePath -> IO A.Value
+    load fileName =
+      A.eitherDecodeFileStrict' fileName
+        >>= either fail return
+    aesonJson :: A.Value -> J.Json
+    aesonJson =
+      \ case
+        A.Null ->
+          J.null
+        A.Bool a ->
+          J.bool a
+        A.Number a ->
+          J.scientificNumber a
+        A.String a ->
+          J.textString a
+        A.Array a ->
+          J.array (fmap aesonJson a)
+        A.Object a ->
+          J.object (HashMap.foldMapWithKey (\ k -> (: []) . (,) k . aesonJson) a)
+
+prop_aesonRoundtrip =
+  withTests 9999 $
+  property $ do
+    sample <- forAll sampleGen
+    let encoding = sampleJsonifier sample
+    annotate (Char8ByteString.unpack encoding)
+    aeson <- evalEither (A.eitherDecodeStrict' encoding)
+    evalEither (maybe (Right ()) Left (detectMismatchInSampleAndAeson sample aeson))
+
+data Sample =
+  NullSample |
+  BoolSample Bool |
+  IntNumberSample Int |
+  WordNumberSample Word |
+  DoubleNumberSample Double |
+  ScientificNumberSample Scientific |
+  TextStringSample Text |
+  ScientificStringSample Scientific |
+  ArraySample [Sample] |
+  ObjectSample [(Text, Sample)]
+  deriving (Eq, Show)
+
+sampleGen :: Gen Sample
+sampleGen =
+  sample
+  where
+    sample =
+      Gen.recursive Gen.choice [
+        null, bool,
+        intNumber,
+        wordNumber,
+        doubleNumber,
+        scientificNumber,
+        textString,
+        scientificString
+        ] [
+        array, object
+        ]
+    null =
+      pure NullSample
+    bool =
+      Gen.bool <&> BoolSample
+    intNumber =
+      Gen.int Range.exponentialBounded <&> IntNumberSample
+    wordNumber =
+      Gen.word Range.exponentialBounded <&> WordNumberSample
+    doubleNumber =
+      GenExtras.realFloat <&> DoubleNumberSample
+    scientificNumber =
+      GenExtras.scientific <&> ScientificNumberSample
+    textString =
+      Gen.text (Range.exponential 0 9999) Gen.unicode <&> TextStringSample
+    scientificString =
+      GenExtras.scientific <&> ScientificStringSample
+    array =
+      Gen.list (Range.exponential 0 999) sample <&> ArraySample
+    object =
+      rowList (Range.exponential 0 999) <&> ObjectSample
+      where
+        rowList range =
+          Gen.list range row <&>
+          nubBy (on (==) fst)
+          where
+            row =
+              Gen.text (Range.exponential 0 99) Gen.unicode
+                & fmap (,)
+                & flip ap sample
+
+sampleJsonifier :: Sample -> ByteString
+sampleJsonifier =
+  J.toByteString . sample
+  where
+    sample =
+      \ case
+        NullSample -> J.null
+        BoolSample a -> J.bool a
+        IntNumberSample a -> J.intNumber a
+        WordNumberSample a -> J.wordNumber a
+        DoubleNumberSample a -> J.doubleNumber a
+        ScientificNumberSample a -> J.scientificNumber a
+        TextStringSample a -> J.textString a
+        ScientificStringSample a -> J.scientificString a
+        ArraySample a -> J.array (fmap sample a)
+        ObjectSample a -> J.object (fmap (fmap sample) a)
+
+sampleAeson :: Sample -> A.Value
+sampleAeson =
+  sample
+  where
+    sample =
+      \ case
+        NullSample -> A.Null
+        BoolSample a -> A.Bool a
+        IntNumberSample a -> A.Number (fromIntegral a)
+        WordNumberSample a -> A.Number (fromIntegral a)
+        DoubleNumberSample a -> realNumber a
+        ScientificNumberSample a -> A.Number a
+        ScientificStringSample a -> A.String (fromString (show a))
+        TextStringSample a -> A.String a
+        ArraySample a -> A.Array (fromList (fmap sample a))
+        ObjectSample a -> A.Object (fromList (fmap (fmap sample) a))
+      where
+        realNumber a =
+          A.Number $
+          if isNaN a || isInfinite a then 0 else (read . show) a
+
+{-|
+We have to come down to this trickery due to small differences in
+the way scientific renders floating point values and how ptr-poker does.
+There is no difference when floating point comparison is used instead of scientific,
+so this is what we achieve here.
+
+It must be mentioned that this only applies to floating point numbers.
+-}
+detectMismatchInSampleAndAeson :: Sample -> A.Value -> Maybe (Sample, A.Value)
+detectMismatchInSampleAndAeson =
+  \ case
+    NullSample ->
+      \ case
+        A.Null -> Nothing
+        a -> Just (NullSample, a)
+    BoolSample a ->
+      \ case
+        A.Bool b | b == a -> Nothing
+        b -> Just (BoolSample a, b)
+    IntNumberSample a ->
+      \ case
+        A.Number b | round b == a -> Nothing
+        b -> Just (IntNumberSample a, b)
+    WordNumberSample a ->
+      \ case
+        A.Number b | round b == a -> Nothing
+        b -> Just (WordNumberSample a, b)
+    DoubleNumberSample a ->
+      \ case
+        -- This is what it's all for.
+        A.Number b | realToFrac b == if isNaN a || isInfinite a then 0 else a -> Nothing
+        b -> Just (DoubleNumberSample a, b)
+    ScientificNumberSample a ->
+      \ case
+        A.Number b | a == b -> Nothing
+        b -> Just (ScientificNumberSample a, b)
+    TextStringSample a ->
+      \ case
+        A.String b | a == b -> Nothing
+        b -> Just (TextStringSample a, b)
+    ScientificStringSample a ->
+      \ case
+        A.String b | (fromString . show) a == b -> Nothing
+        b -> Just (ScientificStringSample a, b)
+    ArraySample a ->
+      \ case
+        A.Array b | Vector.length b == length a ->
+          toList b
+            & zip a
+            & foldMap (\ (aa, bb) -> fmap First (detectMismatchInSampleAndAeson aa bb))
+            & fmap getFirst
+        b -> Just (ArraySample a, b)
+    ObjectSample a ->
+      \ case
+        A.Object b ->
+          a & foldMap (\ (ak, av) ->
+                case HashMap.lookup ak b of
+                  Just bv -> fmap First (detectMismatchInSampleAndAeson av bv)
+                  Nothing -> Just (First (ObjectSample a, A.Object b))
+                )
+            & fmap getFirst
+        b -> Just (ObjectSample a, b)
diff --git a/test/Main/Util/HedgehogGens.hs b/test/Main/Util/HedgehogGens.hs
new file mode 100644
--- /dev/null
+++ b/test/Main/Util/HedgehogGens.hs
@@ -0,0 +1,26 @@
+module Main.Util.HedgehogGens where
+
+import Prelude
+import Hedgehog
+import qualified Hedgehog.Gen as Gen
+import qualified Hedgehog.Range as Range
+import qualified Numeric.Limits as NumericLimits
+
+
+scientific :: Gen Scientific
+scientific =
+  Gen.realFrac_ (Range.linearFrac (-99999999999999) 99999999999999)
+    <&> fromRational
+
+realFloat =
+  Gen.frequency [
+    (99, realRealFloat)
+    ,
+    (1, nonRealRealFloat)
+    ]
+
+realRealFloat =
+  Gen.realFloat (Range.exponentialFloat NumericLimits.minValue NumericLimits.maxValue)
+
+nonRealRealFloat =
+  Gen.element [0 / 0, 1 / 0, (-1) / 0, -0]
