diff options
author | Sam T <pxqr.sta@gmail.com> | 2013-05-12 05:22:46 +0400 |
---|---|---|
committer | Sam T <pxqr.sta@gmail.com> | 2013-05-12 05:22:46 +0400 |
commit | 2483bec57a19a9f60b84413ba2a9c9953aab9817 (patch) | |
tree | 04e78ab505db1ddcb136553209506849c50721f2 /src | |
parent | 5236d3370c8dbae456b147ac287828bb1be0b900 (diff) |
+ Add instance for tuples.
Diffstat (limited to 'src')
-rw-r--r-- | src/Data/BEncode.hs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/Data/BEncode.hs b/src/Data/BEncode.hs index e3ae292..9b72604 100644 --- a/src/Data/BEncode.hs +++ b/src/Data/BEncode.hs | |||
@@ -179,6 +179,7 @@ instance BEncodable a => BEncodable [a] where | |||
179 | fromBEncode _ = decodingError "list" | 179 | fromBEncode _ = decodingError "list" |
180 | {-# INLINE fromBEncode #-} | 180 | {-# INLINE fromBEncode #-} |
181 | 181 | ||
182 | |||
182 | instance BEncodable a => BEncodable (Map ByteString a) where | 183 | instance BEncodable a => BEncodable (Map ByteString a) where |
183 | {-# SPECIALIZE instance BEncodable (Map ByteString BEncode) #-} | 184 | {-# SPECIALIZE instance BEncodable (Map ByteString BEncode) #-} |
184 | 185 | ||
@@ -189,6 +190,68 @@ instance BEncodable a => BEncodable (Map ByteString a) where | |||
189 | fromBEncode _ = decodingError "dictionary" | 190 | fromBEncode _ = decodingError "dictionary" |
190 | {-# INLINE fromBEncode #-} | 191 | {-# INLINE fromBEncode #-} |
191 | 192 | ||
193 | instance BEncodable () where | ||
194 | {-# SPECIALIZE instance BEncodable () #-} | ||
195 | toBEncode () = BList [] | ||
196 | {-# INLINE toBEncode #-} | ||
197 | |||
198 | fromBEncode (BList []) = Right () | ||
199 | fromBEncode _ = decodingError "Unable to decode unit value" | ||
200 | {-# INLINE fromBEncode #-} | ||
201 | |||
202 | instance (BEncodable a, BEncodable b) => BEncodable (a, b) where | ||
203 | {-# SPECIALIZE instance (BEncodable a, BEncodable b) => BEncodable (a, b) #-} | ||
204 | toBEncode (a, b) = BList [toBEncode a, toBEncode b] | ||
205 | {-# INLINE toBEncode #-} | ||
206 | |||
207 | fromBEncode (BList [a, b]) = (,) <$> fromBEncode a <*> fromBEncode b | ||
208 | fromBEncode _ = decodingError "Unable to decode a pair." | ||
209 | {-# INLINE fromBEncode #-} | ||
210 | |||
211 | instance (BEncodable a, BEncodable b, BEncodable c) => BEncodable (a, b, c) where | ||
212 | {-# SPECIALIZE instance (BEncodable a, BEncodable b, BEncodable c) | ||
213 | => BEncodable (a, b, c) #-} | ||
214 | {-# INLINE toBEncode #-} | ||
215 | toBEncode (a, b, c) = BList [toBEncode a, toBEncode b, toBEncode c] | ||
216 | |||
217 | fromBEncode (BList [a, b, c]) = | ||
218 | (,,) <$> fromBEncode a <*> fromBEncode b <*> fromBEncode c | ||
219 | fromBEncode _ = decodingError "Unable to decode a triple" | ||
220 | {-# INLINE fromBEncode #-} | ||
221 | |||
222 | instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d) | ||
223 | => BEncodable (a, b, c, d) where | ||
224 | {-# SPECIALIZE instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d) | ||
225 | => BEncodable (a, b, c, d) #-} | ||
226 | {-# INLINE toBEncode #-} | ||
227 | toBEncode (a, b, c, d) = BList [ toBEncode a, toBEncode b | ||
228 | , toBEncode c, toBEncode d | ||
229 | ] | ||
230 | |||
231 | fromBEncode (BList [a, b, c, d]) = | ||
232 | (,,,) <$> fromBEncode a <*> fromBEncode b | ||
233 | <*> fromBEncode c <*> fromBEncode d | ||
234 | fromBEncode _ = decodingError "Unable to decode a tuple4" | ||
235 | {-# INLINE fromBEncode #-} | ||
236 | |||
237 | instance (BEncodable a, BEncodable b, BEncodable c, BEncodable d, BEncodable e) | ||
238 | => BEncodable (a, b, c, d, e) where | ||
239 | {-# SPECIALIZE instance ( BEncodable a, BEncodable b | ||
240 | , BEncodable c, BEncodable d | ||
241 | , BEncodable e) | ||
242 | => BEncodable (a, b, c, d, e) #-} | ||
243 | {-# INLINE toBEncode #-} | ||
244 | toBEncode (a, b, c, d, e) = BList [ toBEncode a, toBEncode b | ||
245 | , toBEncode c, toBEncode d | ||
246 | , toBEncode e | ||
247 | ] | ||
248 | |||
249 | fromBEncode (BList [a, b, c, d, e]) = | ||
250 | (,,,,) <$> fromBEncode a <*> fromBEncode b | ||
251 | <*> fromBEncode c <*> fromBEncode d <*> fromBEncode e | ||
252 | fromBEncode _ = decodingError "Unable to decode a tuple5" | ||
253 | {-# INLINE fromBEncode #-} | ||
254 | |||
192 | dictAssoc :: [(ByteString, BEncode)] -> BEncode | 255 | dictAssoc :: [(ByteString, BEncode)] -> BEncode |
193 | dictAssoc = BDict . M.fromList | 256 | dictAssoc = BDict . M.fromList |
194 | {-# INLINE dictAssoc #-} | 257 | {-# INLINE dictAssoc #-} |