packages feed

ptera-core-0.1.0.0: src/Language/Parser/Ptera/Data/Alignable/Array.hs

module Language.Parser.Ptera.Data.Alignable.Array where

import           Language.Parser.Ptera.Prelude

import qualified Data.Array                               as DataArray
import qualified Language.Parser.Ptera.Data.Alignable     as Alignable
import qualified Language.Parser.Ptera.Data.Alignable.Map as AlignableMap


type T = Array

newtype Array n a = Array (DataArray.Array Int a)
    deriving (Eq, Show, Functor, Foldable)

fromTotalMap :: Alignable.T n => n -> AlignableMap.T n a -> Array n a
fromTotalMap b m = Array
    do DataArray.array (0, pred do coerce b) do coerce do AlignableMap.toAscList m

fromList :: forall n a. Alignable.T n => [a] -> Array n a
fromList xs = Array
    do DataArray.listArray (0, length xs - 1) xs

mapWithIx :: Alignable.T n => (n -> a -> a) -> Array n a -> Array n a
mapWithIx f (Array arr) = Array
    do DataArray.listArray
        do DataArray.bounds arr
        do [ f (coerce i) x | (i, x) <- DataArray.assocs arr ]

index :: forall n a. Alignable.T n => Array n a -> n -> Maybe a
index arr i = case Alignable.numIncrements i < length arr of
    False -> Nothing
    True  -> Just do forceIndex arr i

forceIndex :: forall n a. Alignable.T n => Array n a -> n -> a
forceIndex = coerce do (DataArray.!) @Int @a

assocs :: forall n a. Alignable.T n => Array n a -> [(n, a)]
assocs = coerce do DataArray.assocs @Int @a