packages feed

packed-data-0.2.0.0: src/Data/Packed.hs

-- |
--
-- Packed data is data serialised into a binary format that is usable as-is, meaning there is no need to parse it to be able to use it. Another perk of such format is that it can be stored in files easily.
--
-- `packed-data` allows using packed data type-safely, without explicit pointer arithmetic.
--
-- Check out examples here: https://github.com/Arthi-chaud/packed-data/tree/main/examples
--
-- Example of a tree traversal:
--
-- @
-- {-# LANGUAGE DataKinds #-}
-- {-# LANGUAGE TypeOperators #-}
-- {-# LANGUAGE KindSignatures #-}
-- {-# LANGUAGE LambdaCase #-}
-- {-# LANGUAGE GADTs #-}
-- {-# LANGUAGE LambdaCase #-}
-- {-# LANGUAGE TemplateHaskell #-}
-- {-# LANGUAGE TemplateHaskellQuotes #-}
-- {-# LANGUAGE TupleSections #-}
-- {-# LANGUAGE QualifiedDo #-}
-- {-# LANGUAGE ViewPatterns #-}
-- {-# LANGUAGE PatternSynonyms #-}
-- {-# LANGUAGE UnboxedTuples #-}
--
-- import Data.Packed
-- import Data.Packed.Reader
-- import qualified Data.Packed.Reader as R
--
-- data Tree a = Leaf a | Node (Tree a) (Tree a)
-- \$('Data.Packed.mkPacked' ''Tree [])
--
-- myTree :: Tree Int
-- myTree = Node (Leaf 1) (Leaf 2)
--
-- packedTree :: 'Data.Packed.Packed' '[Tree Int]
-- packedTree = 'pack' myTree
--
-- -- The two following functions do th same thing
--
-- sumPacked1 :: 'Data.Packed.Reader.PackedReader' '[Tree Int] r Int
-- sumPacked1 =
--     caseTree -- Generated
--         ( R.do
--             !n <- 'reader'
--             R.'Data.Packed.Reader.return' n
--         )
--         ( R.do
--             !left <- sumPacked1
--             !right <- sumPacked1
--             let !res = left + right
--             R.'Data.Packed.Reader.return' res
--         )
--
-- -- The patterns 'PackedLead' and 'PackedNode' are generated
-- sumPacked2 :: 'Data.Packed.Reader.PackedReader' '[Tree Int] r Int
-- sumPacked2 = 'Data.Packed.Reader.mkPackedReader' $ \case
--     PackedLeaf l -> 'reader' `Data.Packed.Reader.with` l
--     PackedNode n -> 'Data.Packed.Reader.threadedWith' n $ R.do
--         !left <- sumPacked2
--         !right <- sumPacked2
--         let !res = left + right
--         R.'return' res
--
-- runSum :: Int
-- runSum = fst $ 'Data.Packed.Reader.runReader' sumPacked1 packedTree
-- @
module Data.Packed (
    -- * Classes
    Packable (..),
    pack,
    Unpackable (..),
    readerWithoutShift,
    unpack,
    unpack',

    -- * Needs
    Needs,
    runBuilder,
    writeWithFieldSize,
    unsafeCastNeeds,

    -- * Packed
    Packed,
    skipWithFieldSize,
    isolate,
    fromPacked,
    unsafeToPacked,
    unsafeCastPacked,

    -- * PackedReader
    PackedReader,
    mkPackedReader,
    runReader,
    readerWithFieldSize,

    -- * Code generation
    mkPacked,
    PackingFlag (..),

    -- * Utils
    FieldSize (..),
    getFieldSizeFromPacked,
    Skippable (..),
) where

import Data.Packed.FieldSize
import Data.Packed.Needs
import Data.Packed.Packable
import Data.Packed.Packed
import Data.Packed.Reader
import Data.Packed.Skippable
import Data.Packed.TH
import Data.Packed.Unpackable