-- |
-- Module      : Data.Prim.Memory
-- Copyright   : (c) Alexey Kuleshevich 2020
-- License     : BSD3
-- Maintainer  : Alexey Kuleshevich <alexey@kuleshevi.ch>
-- Stability   : experimental
-- Portability : non-portable
--
{-# LANGUAGE BangPatterns #-}

module Data.Prim.Memory
  ( module Data.Prim
  , Pinned(..)
  -- * Immutable
  , Bytes
  , MemRead
  -- ** Size
  , countMem                  -- DOC: [x], DOCTEST [x], TEST: [ ]
  , countRemMem               -- DOC: [x], DOCTEST [x], TEST: [ ]
  , byteCountMem              -- DOC: [x], DOCTEST [ ], TEST: [x]
  -- ** Index
  , indexOffMem               -- DOC: [x], DOCTEST [ ], TEST: [x]
  , indexByteOffMem           -- DOC: [x], DOCTEST [ ], TEST: [x]
  -- ** Construct
  , emptyMem                  -- DOC: [x], DOCTEST [x], TEST: [x]
  , singletonMem              -- DOC: [x], DOCTEST [x], TEST: [ ]
  , cycleMemN                 -- DOC: [x], DOCTEST [x], TEST: [ ]
  , createMemST               -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , createMemST_              -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , createZeroMemST           -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , createZeroMemST_          -- DOC: [x], DOCTEST [x], TEST: [ ]
  -- ** Copy
  , cloneMem                  -- DOC: [x], DOCTEST [x], TEST: [ ]
  , copyMem                   -- DOC: [x], DOCTEST [ ], TEST: [x]
  , copyByteOffMem            -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , copyByteOffToMBytesMem    -- DOC: [x], DOCTEST [ ], TEST: [x]
  , copyByteOffToPtrMem       -- DOC: [x], DOCTEST [ ], TEST: [x]
  -- ** Compare
  , eqMem                     -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , eqOffMem                  -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , eqByteMem                 -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , eqByteOffMem              -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , compareMem                -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , compareOffMem             -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , compareByteMem            -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , compareByteOffMem         -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , compareByteOffToPtrMem    -- DOC: [x], DOCTEST [ ], TEST: [x]
  , compareByteOffToBytesMem  -- DOC: [x], DOCTEST [ ], TEST: [x]
  -- ** Convert
  , convertMem                -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  -- *** To list
  , toListMem                 -- DOC: [x], DOCTEST [x], TEST: [x]
  , toListSlackMem            -- DOC: [x], DOCTEST [x], TEST: [x]
  , toByteListMem             -- DOC: [x], DOCTEST [x], TEST: [x]
  , foldrCountMem             -- DOC: [x], DOCTEST [-], TEST: [-]
  , showsHexMem               -- DOC: [x], DOCTEST [x], TEST: [ ]

  -- *** From list
  , fromListMem               -- DOC: [x], DOCTEST [x], TEST: [x]
  , fromByteListMem           -- DOC: [x], DOCTEST [x], TEST: [x]
  , fromListMemN              -- DOC: [x], DOCTEST [x], TEST: [x]
  , fromListZeroMemN          -- DOC: [x], DOCTEST [x], TEST: [ ]
  , fromListZeroMemN_         -- DOC: [x], DOCTEST [x], TEST: [ ]
  -- * Mutable
  , MBytes
  , MemWrite
  , MemAlloc(FrozenMem)
  , MemState(..)
  -- ** Size
  , getCountMutMem               -- DOC: [x], DOCTEST [x], TEST: [ ]
  , getCountRemMutMem            -- DOC: [x], DOCTEST [x], TEST: [ ]
  , getByteCountMutMem           -- DOC: [x], DOCTEST [x], TEST: [ ]
  -- ** Read
  , readOffMutMem                -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , readByteOffMutMem            -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  -- ** Write
  , writeOffMutMem               -- DOC: [x], DOCTEST [ ], TEST: [x]
  , writeByteOffMutMem           -- DOC: [x], DOCTEST [ ], TEST: [x]
  , setMutMem                    -- DOC: [x], DOCTEST [ ], TEST: [x]
  , modifyFetchOldMutMem         -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , modifyFetchOldMutMemM        -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , modifyFetchNewMutMem         -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , modifyFetchNewMutMemM        -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  -- ** Allocate
  , allocMutMem                  -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , allocZeroMutMem              -- DOC: [x], DOCTEST [x], TEST: [ ]
  , reallocMutMem                -- DOC: [x], DOCTEST [ ], TEST: [x]
  , withScrubbedMutMem           -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , defaultReallocMutMem         -- DOC: [x], DOCTEST [ ], TEST: [x]
  -- ** Thaw/Freeze
  , thawCloneMem                 -- DOC: [x], DOCTEST [x], TEST: [ ]
  , thawCopyMem                  -- DOC: [x], DOCTEST [x], TEST: [ ]
  , thawMem                      -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , freezeCloneMutMem            -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , freezeCopyMutMem             -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , freezeMutMem                 -- DOC: [x], DOCTEST [ ], TEST: [ ]
  -- ** Move
  , cloneMutMem                  -- DOC: [x], DOCTEST [ ], TEST: [-]
  , moveMutMem                   -- DOC: [ ], DOCTEST [ ], TEST: [x]
  , moveByteOffMutMem            -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , moveByteOffToMBytesMutMem    -- DOC: [x], DOCTEST [ ], TEST: [x]
  , moveByteOffToPtrMutMem       -- DOC: [x], DOCTEST [ ], TEST: [x]
  -- ** Load list
  , loadListMutMem               -- DOC: [x], DOCTEST [x], TEST: [x]
  , loadListMutMem_              -- DOC: [x], DOCTEST [x], TEST: [ ]
  , loadListMutMemN              -- DOC: [x], DOCTEST [ ], TEST: [ ]
  , loadListMutMemN_             -- DOC: [x], DOCTEST [ ], TEST: [ ]
  -- *** With offset
  , loadListOffMutMem            -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , loadListOffMutMemN           -- DOC: [ ], DOCTEST [ ], TEST: [ ]
  , loadListByteOffMutMem        -- DOC: [x], DOCTEST [x], TEST: [ ]
  , loadListByteOffMutMemN       -- DOC: [x], DOCTEST [x], TEST: [ ]
  ) where

import Data.Prim
import Data.Prim.Memory.Internal
import Data.Prim.Memory.Fold