MyNixOS website logo
Description

Lenses for bencoded data.

A port of lens-aeson for bencoding.

bencoding-lens

Law abiding lenses and traversals for bencoding, ported from lens-aeson. Works with arbitrary bencoded data, although most examples in the wild are torrent files.

{-# LANGUAGE OverloadedStrings #-}

import Control.Lens
import Data.BEncode
import Data.BEncode.Lens

import Network.HTTP.Simple -- from http-conduit
import Crypto.Hash -- from cryptonite

main = do
  -- Get the ubuntu 20.04 live server torrent file with http-conduit
  torrent <- getResponseBody <$> httpBS "https://releases.ubuntu.com/20.04/ubuntu-20.04.4-live-server-amd64.iso.torrent"
  -- Print some interesting bits of the torrent file

  -- Announce link
  print (torrent ^? key "announce") 
  -- Just (BString "https://torrent.ubuntu.com/announce")

  -- Keys of the top level dict
  print (fmap fst (torrent ^@.. members))
  -- ["announce","announce-list","comment","created by","creation date","info"]

  -- Keys of the info dict
  print (fmap fst (torrent ^@.. key "info" . members))
  -- ["length","name","piece length","pieces"]

  -- Piece length
  print (torrent ^? key "info" . key "piece length" . _BInteger)
  -- Just 262144

  -- Compute the info hash (see definition below)
  print (torrent ^?! infoHash)
  -- b44a0e20fa5b7cecb77156333b4268dfd7c30afb
  
infoHash :: (AsBValue t) => Fold t (Digest SHA1)
infoHash = key "info" . to (hashlazy . encode)
Metadata

Version

0.1.0.0

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows