{-# LANGUAGE CPP               #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module TextShow.Data.Array (showbIArrayPrec) where
import qualified Data.Array as Array (assocs, bounds)
import           Data.Array (Array)
import qualified Data.Array.Base as IArray (assocs, bounds)
import           Data.Array.Base (IArray)
import           Data.Array.Unboxed (UArray)
import           Data.Ix (Ix)
import           Data.Text.Lazy.Builder (Builder)
import           GHC.Show (appPrec)
import           Prelude ()
import           Prelude.Compat
import           TextShow.Classes (TextShow(..), showbParen, showbSpace)
import           TextShow.Data.List ()
import           TextShow.Data.Tuple ()
{-# SPECIALIZE
    showbIArrayPrec :: (IArray UArray e, Ix i, TextShow i, TextShow e) =>
                        Int -> UArray i e -> Builder
  #-}
showbIArrayPrec :: (IArray a e, Ix i, TextShow i, TextShow e) => Int -> a i e -> Builder
showbIArrayPrec :: Int -> a i e -> Builder
showbIArrayPrec Int
p a i e
a = Bool -> Builder -> Builder
showbParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
arrayPrec) (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$
       Builder
"array "
    Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (i, i) -> Builder
forall a. TextShow a => a -> Builder
showb (a i e -> (i, i)
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> (i, i)
IArray.bounds a i e
a)
    Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
showbSpace
    Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> [(i, e)] -> Builder
forall a. TextShow a => a -> Builder
showb (a i e -> [(i, e)]
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> [(i, e)]
IArray.assocs a i e
a)
  where
    arrayPrec :: Int
#if MIN_VERSION_base(4,13,0)
    arrayPrec :: Int
arrayPrec = Int
appPrec
#else
    arrayPrec = 9
#endif
instance (TextShow i, TextShow e, Ix i) => TextShow (Array i e) where
    showbPrec :: Int -> Array i e -> Builder
showbPrec Int
p Array i e
a = Bool -> Builder -> Builder
showbParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
appPrec) (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$
           Builder
"array "
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (i, i) -> Builder
forall a. TextShow a => a -> Builder
showb (Array i e -> (i, i)
forall i e. Array i e -> (i, i)
Array.bounds Array i e
a)
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
showbSpace
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> [(i, e)] -> Builder
forall a. TextShow a => a -> Builder
showb (Array i e -> [(i, e)]
forall i e. Ix i => Array i e -> [(i, e)]
Array.assocs Array i e
a)
    {-# INLINE showbPrec #-}
instance (IArray UArray e, Ix i, TextShow i, TextShow e) => TextShow (UArray i e) where
    showbPrec :: Int -> UArray i e -> Builder
showbPrec = Int -> UArray i e -> Builder
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i, TextShow i, TextShow e) =>
Int -> a i e -> Builder
showbIArrayPrec
    {-# INLINE showbPrec #-}