This file is indexed.

/usr/share/doc/libghc-postgresql-simple-doc/html/src/Database-PostgreSQL-Simple-Types.html is in libghc-postgresql-simple-doc 0.4.0.2-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Database/PostgreSQL/Simple/Types.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, GeneralizedNewtypeDeriving #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-4"></a><span class='hs-comment'>-- |</span>
<a name="line-5"></a><span class='hs-comment'>-- Module:      Database.PostgreSQL.Simple.Types</span>
<a name="line-6"></a><span class='hs-comment'>-- Copyright:   (c) 2011 MailRank, Inc.</span>
<a name="line-7"></a><span class='hs-comment'>--              (c) 2011-2012 Leon P Smith</span>
<a name="line-8"></a><span class='hs-comment'>-- License:     BSD3</span>
<a name="line-9"></a><span class='hs-comment'>-- Maintainer:  Leon P Smith &lt;leon@melding-monads.com&gt;</span>
<a name="line-10"></a><span class='hs-comment'>-- Stability:   experimental</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- Basic types.</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-15"></a>
<a name="line-16"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-17"></a>    <span class='hs-layout'>(</span>
<a name="line-18"></a>      <span class='hs-conid'>Null</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-19"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Default</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-20"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Only</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-21"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>In</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-22"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Binary</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-23"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Query</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-24"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Oid</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-25"></a>    <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-conop'>:.</span><span class='hs-layout'>)</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-26"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Savepoint</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-27"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>PGArray</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-28"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Blaze</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Builder</span> <span class='hs-layout'>(</span><span class='hs-varid'>toByteString</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Arrow</span> <span class='hs-layout'>(</span><span class='hs-varid'>first</span><span class='hs-layout'>)</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-layout'>(</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>IsString</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Blaze</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Builder</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span><span class='hs-varop'>.</span><span class='hs-conid'>Utf8</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Utf8</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>B</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Database</span><span class='hs-varop'>.</span><span class='hs-conid'>PostgreSQL</span><span class='hs-varop'>.</span><span class='hs-conid'>LibPQ</span> <span class='hs-layout'>(</span><span class='hs-conid'>Oid</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="Null"></a><span class='hs-comment'>-- | A placeholder for the SQL @NULL@ value.</span>
<a name="line-41"></a><a name="Null"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Null</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Null</span>
<a name="line-42"></a>          <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="instance%20Eq%20Null"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>Null</span> <span class='hs-keyword'>where</span>
<a name="line-45"></a>    <span class='hs-keyword'>_</span> <span class='hs-varop'>==</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-46"></a>    <span class='hs-keyword'>_</span> <span class='hs-varop'>/=</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="Default"></a><span class='hs-comment'>-- | A placeholder for the PostgreSQL @DEFAULT@ value.</span>
<a name="line-49"></a><a name="Default"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Default</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Default</span>
<a name="line-50"></a>           <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="Query"></a><span class='hs-comment'>-- | A query string. This type is intended to make it difficult to</span>
<a name="line-53"></a><a name="Query"></a><span class='hs-comment'>-- construct a SQL query by concatenating string fragments, as that is</span>
<a name="line-54"></a><a name="Query"></a><span class='hs-comment'>-- an extremely common way to accidentally introduce SQL injection</span>
<a name="line-55"></a><a name="Query"></a><span class='hs-comment'>-- vulnerabilities into an application.</span>
<a name="line-56"></a><a name="Query"></a><span class='hs-comment'>--</span>
<a name="line-57"></a><a name="Query"></a><span class='hs-comment'>-- This type is an instance of 'IsString', so the easiest way to</span>
<a name="line-58"></a><a name="Query"></a><span class='hs-comment'>-- construct a query is to enable the @OverloadedStrings@ language</span>
<a name="line-59"></a><a name="Query"></a><span class='hs-comment'>-- extension and then simply write the query in double quotes.</span>
<a name="line-60"></a><a name="Query"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><a name="Query"></a><span class='hs-comment'>-- &gt; {-# LANGUAGE OverloadedStrings #-}</span>
<a name="line-62"></a><a name="Query"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-63"></a><a name="Query"></a><span class='hs-comment'>-- &gt; import Database.PostgreSQL.Simple</span>
<a name="line-64"></a><a name="Query"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-65"></a><a name="Query"></a><span class='hs-comment'>-- &gt; q :: Query</span>
<a name="line-66"></a><a name="Query"></a><span class='hs-comment'>-- &gt; q = "select ?"</span>
<a name="line-67"></a><a name="Query"></a><span class='hs-comment'>--</span>
<a name="line-68"></a><a name="Query"></a><span class='hs-comment'>-- The underlying type is a 'ByteString', and literal Haskell strings</span>
<a name="line-69"></a><a name="Query"></a><span class='hs-comment'>-- that contain Unicode characters will be correctly transformed to</span>
<a name="line-70"></a><a name="Query"></a><span class='hs-comment'>-- UTF-8.</span>
<a name="line-71"></a><a name="Query"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Query</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>{</span>
<a name="line-72"></a>      <span class='hs-varid'>fromQuery</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ByteString</span>
<a name="line-73"></a>    <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="instance%20Show%20Query"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>Query</span> <span class='hs-keyword'>where</span>
<a name="line-76"></a>    <span class='hs-varid'>show</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fromQuery</span>
<a name="line-77"></a>
<a name="line-78"></a><a name="instance%20Read%20Query"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>Query</span> <span class='hs-keyword'>where</span>
<a name="line-79"></a>    <span class='hs-varid'>readsPrec</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>first</span> <span class='hs-conid'>Query</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>readsPrec</span> <span class='hs-varid'>i</span>
<a name="line-80"></a>
<a name="line-81"></a><a name="instance%20IsString%20Query"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>IsString</span> <span class='hs-conid'>Query</span> <span class='hs-keyword'>where</span>
<a name="line-82"></a>    <span class='hs-varid'>fromString</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toByteString</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Utf8</span><span class='hs-varop'>.</span><span class='hs-varid'>fromString</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="instance%20Monoid%20Query"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monoid</span> <span class='hs-conid'>Query</span> <span class='hs-keyword'>where</span>
<a name="line-85"></a>    <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-86"></a>    <span class='hs-varid'>mappend</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>append</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-87"></a>    <span class='hs-comment'>{-# INLINE mappend #-}</span>
<a name="line-88"></a>    <span class='hs-varid'>mconcat</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Query</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>concat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>fromQuery</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-89"></a>
<a name="line-90"></a><a name="Only"></a><span class='hs-comment'>-- | A single-value \"collection\".</span>
<a name="line-91"></a><a name="Only"></a><span class='hs-comment'>--</span>
<a name="line-92"></a><a name="Only"></a><span class='hs-comment'>-- This is useful if you need to supply a single parameter to a SQL</span>
<a name="line-93"></a><a name="Only"></a><span class='hs-comment'>-- query, or extract a single column from a SQL result.</span>
<a name="line-94"></a><a name="Only"></a><span class='hs-comment'>--</span>
<a name="line-95"></a><a name="Only"></a><span class='hs-comment'>-- Parameter example:</span>
<a name="line-96"></a><a name="Only"></a><span class='hs-comment'>--</span>
<a name="line-97"></a><a name="Only"></a><span class='hs-comment'>-- @query c \"select x from scores where x &gt; ?\" ('Only' (42::Int))@</span>
<a name="line-98"></a><a name="Only"></a><span class='hs-comment'>--</span>
<a name="line-99"></a><a name="Only"></a><span class='hs-comment'>-- Result example:</span>
<a name="line-100"></a><a name="Only"></a><span class='hs-comment'>--</span>
<a name="line-101"></a><a name="Only"></a><span class='hs-comment'>-- @xs &lt;- query_ c \"select id from users\"</span>
<a name="line-102"></a><a name="Only"></a><span class='hs-comment'>--forM_ xs $ \\('Only' id) -&gt; {- ... -}@</span>
<a name="line-103"></a><a name="Only"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Only</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Only</span> <span class='hs-layout'>{</span>
<a name="line-104"></a>      <span class='hs-varid'>fromOnly</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
<a name="line-105"></a>    <span class='hs-layout'>}</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="In"></a><span class='hs-comment'>-- | Wrap a list of values for use in an @IN@ clause.  Replaces a</span>
<a name="line-108"></a><a name="In"></a><span class='hs-comment'>-- single \"@?@\" character with a parenthesized list of rendered</span>
<a name="line-109"></a><a name="In"></a><span class='hs-comment'>-- values.</span>
<a name="line-110"></a><a name="In"></a><span class='hs-comment'>--</span>
<a name="line-111"></a><a name="In"></a><span class='hs-comment'>-- Example:</span>
<a name="line-112"></a><a name="In"></a><span class='hs-comment'>--</span>
<a name="line-113"></a><a name="In"></a><span class='hs-comment'>-- &gt; query c "select * from whatever where id in ?" (Only (In [3,4,5]))</span>
<a name="line-114"></a><a name="In"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>In</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>In</span> <span class='hs-varid'>a</span>
<a name="line-115"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-116"></a>
<a name="line-117"></a><a name="Binary"></a><span class='hs-comment'>-- | Wrap binary data for use as a @bytea@ value.</span>
<a name="line-118"></a><a name="Binary"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Binary</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Binary</span> <span class='hs-layout'>{</span><span class='hs-varid'>fromBinary</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>}</span>
<a name="line-119"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-120"></a>
<a name="line-121"></a>
<a name="line-122"></a><a name="PGArray"></a><span class='hs-comment'>-- | Wrap a list for use as a PostgreSQL array.</span>
<a name="line-123"></a><a name="PGArray"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>PGArray</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PGArray</span> <span class='hs-layout'>{</span><span class='hs-varid'>fromPGArray</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>}</span>
<a name="line-124"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-conid'>Functor</span><span class='hs-layout'>)</span>
<a name="line-125"></a>
<a name="line-126"></a><span class='hs-comment'>-- | A composite type to parse your custom data structures without</span>
<a name="line-127"></a><span class='hs-comment'>-- having to define dummy newtype wrappers every time.</span>
<a name="line-128"></a><span class='hs-comment'>--</span>
<a name="line-129"></a><span class='hs-comment'>--</span>
<a name="line-130"></a><span class='hs-comment'>-- &gt; instance FromRow MyData where ...</span>
<a name="line-131"></a><span class='hs-comment'>--</span>
<a name="line-132"></a><span class='hs-comment'>-- &gt; instance FromRow MyData2 where ...</span>
<a name="line-133"></a><span class='hs-comment'>--</span>
<a name="line-134"></a><span class='hs-comment'>--</span>
<a name="line-135"></a><span class='hs-comment'>-- then I can do the following for free:</span>
<a name="line-136"></a><span class='hs-comment'>--</span>
<a name="line-137"></a><span class='hs-comment'>-- @</span>
<a name="line-138"></a><span class='hs-comment'>-- res &lt;- query' c "..."</span>
<a name="line-139"></a><span class='hs-comment'>-- forM res $ \\(MyData{..} :. MyData2{..}) -&gt; do</span>
<a name="line-140"></a><span class='hs-comment'>--   ....</span>
<a name="line-141"></a><span class='hs-comment'>-- @</span>
<a name="line-142"></a><span class='hs-keyword'>data</span> <span class='hs-varid'>h</span> <span class='hs-conop'>:.</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>h</span> <span class='hs-conop'>:.</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Ord</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Read</span><span class='hs-layout'>,</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-143"></a>
<a name="line-144"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>3</span> <span class='hs-conop'>:.</span>
<a name="line-145"></a>
<a name="line-146"></a><a name="Savepoint"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Savepoint</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Savepoint</span> <span class='hs-conid'>Query</span>
<a name="line-147"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
</pre></body>
</html>