-- |
-- Module      : Data.Array.CArray
-- Copyright   : (c) 2008 Jed Brown
-- License     : BSD-style
-- 
-- Maintainer  : jed@59A2.org
-- Stability   : experimental
-- Portability : non-portable
--
-- This module provides the immutable 'CArray' which uses pinned memory on the
-- GC'd heap.  Elements are stored according to the class 'Storable'.  You can
-- obtain a pointer to the array contents to manipulate elements from
-- languages like C.
--
-- 'CArray' is 16-byte aligned by default.  If you create a 'CArray' with
-- 'unsafeForeignPtrToCArray' then it may not be aligned.  This will be an issue
-- if you intend to use SIMD instructions.
--
-- 'CArray' is similar to 'Data.Array.Unboxed.UArray' but slower if you stay
-- within Haskell.  'CArray' can handle more types and can be used by external
-- libraries.
--
-- 'CArray' has an instance of 'Binary'.
-----------------------------------------------------------------------------

module Data.Array.CArray (
    -- * CArray type
    CArray,

    -- * Multi-dimensional

    -- ** Fast reshaping
    reshape,
    flatten,

    -- ** Query
    rank,
    shape,
    size,

    -- * Mapping

    -- ** General
    ixmapWithIndP,
    ixmapWithInd,
    ixmapWithP,
    ixmapWith,
    ixmapP,

    -- ** Slicing
    sliceStrideWithP,
    sliceStrideWith,
    sliceStrideP,
    sliceStride,
    sliceWithP,
    sliceWith,
    sliceP,
    slice,

    -- * Lifting
    liftArrayP,
    liftArray,
    liftArray2P,
    liftArray2,
    liftArray3P,
    liftArray3,

    -- * Norms
    normp,
    norm2,
    normSup,

    -- * Types
    Shapable,
    Abs,

    -- * Unsafe low-level
    withCArray,
    unsafeForeignPtrToCArray,
    toForeignPtr,
    unsafeCArrayToByteString,
    unsafeByteStringToCArray,
    createCArray,

   -- * The overloaded immutable array interface
   module Data.Array.IArray
) where

import Data.Ix.Shapable
import Data.Array.IArray
import Data.Array.CArray.Base