{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
module Data.Array.Nested.Mixed where

import Prelude hiding (mconcat)

import Control.DeepSeq (NFData(..))
import Control.Monad (forM_, when)
import Control.Monad.ST
import Data.Array.RankedS qualified as S
import Data.Bifunctor (bimap)
import Data.Coerce
import Data.Foldable (toList)
import Data.Int
import Data.Kind (Type)
import Data.List.NonEmpty (NonEmpty(..))
import Data.List.NonEmpty qualified as NE
import Data.Proxy
import Data.Type.Equality
import Data.Vector.Storable qualified as VS
import Data.Vector.Storable.Mutable qualified as VSM
import Foreign.C.Types (CInt)
import Foreign.Storable (Storable)
import GHC.Float qualified (expm1, log1mexp, log1p, log1pexp)
import GHC.Generics (Generic)
import GHC.TypeLits

import Data.Array.Nested.Lemmas
import Data.Array.Nested.Mixed.Shape
import Data.Array.Nested.Permutation
import Data.Array.Nested.Types
import Data.Array.Strided.Orthotope
import Data.Array.XArray (XArray(..))
import Data.Array.XArray qualified as X
import Data.Bag


-- TODO:
--   sumAllPrim :: (PrimElt a, NumElt a) => Mixed sh a -> a
--   rminIndex1 :: Ranked (n + 1) a -> Ranked n Int
--   gather/scatter-like things (most generally, the higher-order variants: accelerate's backpermute/permute)
--   After benchmarking: matmul and matvec



-- Invariant in the API
-- ====================
--
-- In the underlying XArray, there is some shape for elements of an empty
-- array. For example, for this array:
--
--   arr :: Ranked I3 (Ranked I2 Int, Ranked I1 Float)
--   rshape arr == 0 :.: 0 :.: 0 :.: ZIR
--
-- the two underlying XArrays have a shape, and those shapes might be anything.
-- The invariant is that these element shapes are unobservable in the API.
-- (This is possible because you ought to not be able to get to such an element
-- without indexing out of bounds.)
--
-- Note, though, that the converse situation may arise: the outer array might
-- be nonempty but then the inner arrays might. This is fine, an invariant only
-- applies if the _outer_ array is empty.
--
-- TODO: can we enforce that the elements of an empty (nested) array have
-- all-zero shape?
--   -> no, because mlift and also any kind of internals probing from outsiders


-- Primitive element types
-- =======================
--
-- There are a few primitive element types; arrays containing elements of such
-- type are a newtype over an XArray, which it itself a newtype over a Vector.
-- Unfortunately, the setup of the library requires us to list these primitive
-- element types multiple times; to aid in extending the list, all these lists
-- have been marked with [PRIMITIVE ELEMENT TYPES LIST].


-- | Wrapper type used as a tag to attach instances on. The instances on arrays
-- of @'Primitive' a@ are more polymorphic than the direct instances for arrays
-- of scalars; this means that if @orthotope@ supports an element type @T@ that
-- this library does not (directly), it may just work if you use an array of
-- @'Primitive' T@ instead.
newtype Primitive a = Primitive a
  deriving (Int -> Primitive a -> ShowS
[Primitive a] -> ShowS
Primitive a -> String
(Int -> Primitive a -> ShowS)
-> (Primitive a -> String)
-> ([Primitive a] -> ShowS)
-> Show (Primitive a)
forall a. Show a => Int -> Primitive a -> ShowS
forall a. Show a => [Primitive a] -> ShowS
forall a. Show a => Primitive a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Primitive a -> ShowS
showsPrec :: Int -> Primitive a -> ShowS
$cshow :: forall a. Show a => Primitive a -> String
show :: Primitive a -> String
$cshowList :: forall a. Show a => [Primitive a] -> ShowS
showList :: [Primitive a] -> ShowS
Show)

-- | Element types that are primitive; arrays of these types are just a newtype
-- wrapper over an array.
class (Storable a, Elt a) => PrimElt a where
  fromPrimitive :: Mixed sh (Primitive a) -> Mixed sh a
  toPrimitive :: Mixed sh a -> Mixed sh (Primitive a)

  default fromPrimitive :: Coercible (Mixed sh a) (Mixed sh (Primitive a)) => Mixed sh (Primitive a) -> Mixed sh a
  fromPrimitive = Mixed sh (Primitive a) -> Mixed sh a
forall a b. Coercible a b => a -> b
coerce

  default toPrimitive :: Coercible (Mixed sh (Primitive a)) (Mixed sh a) => Mixed sh a -> Mixed sh (Primitive a)
  toPrimitive = Mixed sh a -> Mixed sh (Primitive a)
forall a b. Coercible a b => a -> b
coerce

-- [PRIMITIVE ELEMENT TYPES LIST]
instance PrimElt Bool
instance PrimElt Int
instance PrimElt Int64
instance PrimElt Int32
instance PrimElt CInt
instance PrimElt Float
instance PrimElt Double
instance PrimElt ()


-- | Mixed arrays: some dimensions are size-typed, some are not. Distributes
-- over product-typed elements using a data family so that the full array is
-- always in struct-of-arrays format.
--
-- Built on top of 'XArray' which is built on top of @orthotope@, meaning that
-- dimension permutations (e.g. 'mtranspose') are typically free.
--
-- Many of the methods for working on 'Mixed' arrays come from the 'Elt' type
-- class.
type Mixed :: [Maybe Nat] -> Type -> Type
data family Mixed sh a
-- NOTE: When opening up the Mixed abstraction, you might see dimension sizes
-- that you're not supposed to see. In particular, you might see (nonempty)
-- sizes of the elements of an empty array, which is information that should
-- ostensibly not exist; the full array is still empty.

#ifdef OXAR_DEFAULT_SHOW_INSTANCES
#define ANDSHOW , Show
#else
#define ANDSHOW
#endif

data instance Mixed sh (Primitive a) = M_Primitive !(IShX sh) !(XArray sh a)
  deriving (Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
(Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool)
-> (Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool)
-> Eq (Mixed sh (Primitive a))
forall (sh :: [Maybe Nat]) a.
(Eq a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]) a.
(Eq a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
== :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
$c/= :: forall (sh :: [Maybe Nat]) a.
(Eq a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
/= :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
Eq, Eq (Mixed sh (Primitive a))
Eq (Mixed sh (Primitive a)) =>
(Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Ordering)
-> (Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool)
-> (Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool)
-> (Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool)
-> (Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool)
-> (Mixed sh (Primitive a)
    -> Mixed sh (Primitive a) -> Mixed sh (Primitive a))
-> (Mixed sh (Primitive a)
    -> Mixed sh (Primitive a) -> Mixed sh (Primitive a))
-> Ord (Mixed sh (Primitive a))
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Ordering
Mixed sh (Primitive a)
-> Mixed sh (Primitive a) -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Eq (Mixed sh (Primitive a))
forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Ordering
forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a)
-> Mixed sh (Primitive a) -> Mixed sh (Primitive a)
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Ordering
compare :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Ordering
$c< :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
< :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
$c<= :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
<= :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
$c> :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
> :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
$c>= :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
>= :: Mixed sh (Primitive a) -> Mixed sh (Primitive a) -> Bool
$cmax :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a)
-> Mixed sh (Primitive a) -> Mixed sh (Primitive a)
max :: Mixed sh (Primitive a)
-> Mixed sh (Primitive a) -> Mixed sh (Primitive a)
$cmin :: forall (sh :: [Maybe Nat]) a.
(Ord a, Storable a) =>
Mixed sh (Primitive a)
-> Mixed sh (Primitive a) -> Mixed sh (Primitive a)
min :: Mixed sh (Primitive a)
-> Mixed sh (Primitive a) -> Mixed sh (Primitive a)
Ord, (forall x.
 Mixed sh (Primitive a) -> Rep (Mixed sh (Primitive a)) x)
-> (forall x.
    Rep (Mixed sh (Primitive a)) x -> Mixed sh (Primitive a))
-> Generic (Mixed sh (Primitive a))
forall (sh :: [Maybe Nat]) a x.
Rep (Mixed sh (Primitive a)) x -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a x.
Mixed sh (Primitive a) -> Rep (Mixed sh (Primitive a)) x
forall x. Rep (Mixed sh (Primitive a)) x -> Mixed sh (Primitive a)
forall x. Mixed sh (Primitive a) -> Rep (Mixed sh (Primitive a)) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) a x.
Mixed sh (Primitive a) -> Rep (Mixed sh (Primitive a)) x
from :: forall x. Mixed sh (Primitive a) -> Rep (Mixed sh (Primitive a)) x
$cto :: forall (sh :: [Maybe Nat]) a x.
Rep (Mixed sh (Primitive a)) x -> Mixed sh (Primitive a)
to :: forall x. Rep (Mixed sh (Primitive a)) x -> Mixed sh (Primitive a)
Generic ANDSHOW)

-- [PRIMITIVE ELEMENT TYPES LIST]
newtype instance Mixed sh Bool = M_Bool (Mixed sh (Primitive Bool)) deriving (Mixed sh Bool -> Mixed sh Bool -> Bool
(Mixed sh Bool -> Mixed sh Bool -> Bool)
-> (Mixed sh Bool -> Mixed sh Bool -> Bool) -> Eq (Mixed sh Bool)
forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
== :: Mixed sh Bool -> Mixed sh Bool -> Bool
$c/= :: forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
/= :: Mixed sh Bool -> Mixed sh Bool -> Bool
Eq, Eq (Mixed sh Bool)
Eq (Mixed sh Bool) =>
(Mixed sh Bool -> Mixed sh Bool -> Ordering)
-> (Mixed sh Bool -> Mixed sh Bool -> Bool)
-> (Mixed sh Bool -> Mixed sh Bool -> Bool)
-> (Mixed sh Bool -> Mixed sh Bool -> Bool)
-> (Mixed sh Bool -> Mixed sh Bool -> Bool)
-> (Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool)
-> (Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool)
-> Ord (Mixed sh Bool)
Mixed sh Bool -> Mixed sh Bool -> Bool
Mixed sh Bool -> Mixed sh Bool -> Ordering
Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool
forall (sh :: [Maybe Nat]). Eq (Mixed sh Bool)
forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh Bool -> Mixed sh Bool -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh Bool -> Mixed sh Bool -> Ordering
compare :: Mixed sh Bool -> Mixed sh Bool -> Ordering
$c< :: forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
< :: Mixed sh Bool -> Mixed sh Bool -> Bool
$c<= :: forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
<= :: Mixed sh Bool -> Mixed sh Bool -> Bool
$c> :: forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
> :: Mixed sh Bool -> Mixed sh Bool -> Bool
$c>= :: forall (sh :: [Maybe Nat]). Mixed sh Bool -> Mixed sh Bool -> Bool
>= :: Mixed sh Bool -> Mixed sh Bool -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool
max :: Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool
min :: Mixed sh Bool -> Mixed sh Bool -> Mixed sh Bool
Ord, (forall x. Mixed sh Bool -> Rep (Mixed sh Bool) x)
-> (forall x. Rep (Mixed sh Bool) x -> Mixed sh Bool)
-> Generic (Mixed sh Bool)
forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Bool) x -> Mixed sh Bool
forall (sh :: [Maybe Nat]) x.
Mixed sh Bool -> Rep (Mixed sh Bool) x
forall x. Rep (Mixed sh Bool) x -> Mixed sh Bool
forall x. Mixed sh Bool -> Rep (Mixed sh Bool) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x.
Mixed sh Bool -> Rep (Mixed sh Bool) x
from :: forall x. Mixed sh Bool -> Rep (Mixed sh Bool) x
$cto :: forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Bool) x -> Mixed sh Bool
to :: forall x. Rep (Mixed sh Bool) x -> Mixed sh Bool
Generic ANDSHOW)
newtype instance Mixed sh Int = M_Int (Mixed sh (Primitive Int)) deriving (Mixed sh Int -> Mixed sh Int -> Bool
(Mixed sh Int -> Mixed sh Int -> Bool)
-> (Mixed sh Int -> Mixed sh Int -> Bool) -> Eq (Mixed sh Int)
forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
== :: Mixed sh Int -> Mixed sh Int -> Bool
$c/= :: forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
/= :: Mixed sh Int -> Mixed sh Int -> Bool
Eq, Eq (Mixed sh Int)
Eq (Mixed sh Int) =>
(Mixed sh Int -> Mixed sh Int -> Ordering)
-> (Mixed sh Int -> Mixed sh Int -> Bool)
-> (Mixed sh Int -> Mixed sh Int -> Bool)
-> (Mixed sh Int -> Mixed sh Int -> Bool)
-> (Mixed sh Int -> Mixed sh Int -> Bool)
-> (Mixed sh Int -> Mixed sh Int -> Mixed sh Int)
-> (Mixed sh Int -> Mixed sh Int -> Mixed sh Int)
-> Ord (Mixed sh Int)
Mixed sh Int -> Mixed sh Int -> Bool
Mixed sh Int -> Mixed sh Int -> Ordering
Mixed sh Int -> Mixed sh Int -> Mixed sh Int
forall (sh :: [Maybe Nat]). Eq (Mixed sh Int)
forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh Int -> Mixed sh Int -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh Int -> Mixed sh Int -> Mixed sh Int
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh Int -> Mixed sh Int -> Ordering
compare :: Mixed sh Int -> Mixed sh Int -> Ordering
$c< :: forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
< :: Mixed sh Int -> Mixed sh Int -> Bool
$c<= :: forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
<= :: Mixed sh Int -> Mixed sh Int -> Bool
$c> :: forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
> :: Mixed sh Int -> Mixed sh Int -> Bool
$c>= :: forall (sh :: [Maybe Nat]). Mixed sh Int -> Mixed sh Int -> Bool
>= :: Mixed sh Int -> Mixed sh Int -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh Int -> Mixed sh Int -> Mixed sh Int
max :: Mixed sh Int -> Mixed sh Int -> Mixed sh Int
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh Int -> Mixed sh Int -> Mixed sh Int
min :: Mixed sh Int -> Mixed sh Int -> Mixed sh Int
Ord, (forall x. Mixed sh Int -> Rep (Mixed sh Int) x)
-> (forall x. Rep (Mixed sh Int) x -> Mixed sh Int)
-> Generic (Mixed sh Int)
forall (sh :: [Maybe Nat]) x. Rep (Mixed sh Int) x -> Mixed sh Int
forall (sh :: [Maybe Nat]) x. Mixed sh Int -> Rep (Mixed sh Int) x
forall x. Rep (Mixed sh Int) x -> Mixed sh Int
forall x. Mixed sh Int -> Rep (Mixed sh Int) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x. Mixed sh Int -> Rep (Mixed sh Int) x
from :: forall x. Mixed sh Int -> Rep (Mixed sh Int) x
$cto :: forall (sh :: [Maybe Nat]) x. Rep (Mixed sh Int) x -> Mixed sh Int
to :: forall x. Rep (Mixed sh Int) x -> Mixed sh Int
Generic ANDSHOW)
newtype instance Mixed sh Int64 = M_Int64 (Mixed sh (Primitive Int64)) deriving (Mixed sh Int64 -> Mixed sh Int64 -> Bool
(Mixed sh Int64 -> Mixed sh Int64 -> Bool)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Bool)
-> Eq (Mixed sh Int64)
forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
== :: Mixed sh Int64 -> Mixed sh Int64 -> Bool
$c/= :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
/= :: Mixed sh Int64 -> Mixed sh Int64 -> Bool
Eq, Eq (Mixed sh Int64)
Eq (Mixed sh Int64) =>
(Mixed sh Int64 -> Mixed sh Int64 -> Ordering)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Bool)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Bool)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Bool)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Bool)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64)
-> (Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64)
-> Ord (Mixed sh Int64)
Mixed sh Int64 -> Mixed sh Int64 -> Bool
Mixed sh Int64 -> Mixed sh Int64 -> Ordering
Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64
forall (sh :: [Maybe Nat]). Eq (Mixed sh Int64)
forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Ordering
compare :: Mixed sh Int64 -> Mixed sh Int64 -> Ordering
$c< :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
< :: Mixed sh Int64 -> Mixed sh Int64 -> Bool
$c<= :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
<= :: Mixed sh Int64 -> Mixed sh Int64 -> Bool
$c> :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
> :: Mixed sh Int64 -> Mixed sh Int64 -> Bool
$c>= :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Bool
>= :: Mixed sh Int64 -> Mixed sh Int64 -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64
max :: Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64
min :: Mixed sh Int64 -> Mixed sh Int64 -> Mixed sh Int64
Ord, (forall x. Mixed sh Int64 -> Rep (Mixed sh Int64) x)
-> (forall x. Rep (Mixed sh Int64) x -> Mixed sh Int64)
-> Generic (Mixed sh Int64)
forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Int64) x -> Mixed sh Int64
forall (sh :: [Maybe Nat]) x.
Mixed sh Int64 -> Rep (Mixed sh Int64) x
forall x. Rep (Mixed sh Int64) x -> Mixed sh Int64
forall x. Mixed sh Int64 -> Rep (Mixed sh Int64) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x.
Mixed sh Int64 -> Rep (Mixed sh Int64) x
from :: forall x. Mixed sh Int64 -> Rep (Mixed sh Int64) x
$cto :: forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Int64) x -> Mixed sh Int64
to :: forall x. Rep (Mixed sh Int64) x -> Mixed sh Int64
Generic ANDSHOW)
newtype instance Mixed sh Int32 = M_Int32 (Mixed sh (Primitive Int32)) deriving (Mixed sh Int32 -> Mixed sh Int32 -> Bool
(Mixed sh Int32 -> Mixed sh Int32 -> Bool)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Bool)
-> Eq (Mixed sh Int32)
forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
== :: Mixed sh Int32 -> Mixed sh Int32 -> Bool
$c/= :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
/= :: Mixed sh Int32 -> Mixed sh Int32 -> Bool
Eq, Eq (Mixed sh Int32)
Eq (Mixed sh Int32) =>
(Mixed sh Int32 -> Mixed sh Int32 -> Ordering)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Bool)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Bool)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Bool)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Bool)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32)
-> (Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32)
-> Ord (Mixed sh Int32)
Mixed sh Int32 -> Mixed sh Int32 -> Bool
Mixed sh Int32 -> Mixed sh Int32 -> Ordering
Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32
forall (sh :: [Maybe Nat]). Eq (Mixed sh Int32)
forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Ordering
compare :: Mixed sh Int32 -> Mixed sh Int32 -> Ordering
$c< :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
< :: Mixed sh Int32 -> Mixed sh Int32 -> Bool
$c<= :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
<= :: Mixed sh Int32 -> Mixed sh Int32 -> Bool
$c> :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
> :: Mixed sh Int32 -> Mixed sh Int32 -> Bool
$c>= :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Bool
>= :: Mixed sh Int32 -> Mixed sh Int32 -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32
max :: Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32
min :: Mixed sh Int32 -> Mixed sh Int32 -> Mixed sh Int32
Ord, (forall x. Mixed sh Int32 -> Rep (Mixed sh Int32) x)
-> (forall x. Rep (Mixed sh Int32) x -> Mixed sh Int32)
-> Generic (Mixed sh Int32)
forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Int32) x -> Mixed sh Int32
forall (sh :: [Maybe Nat]) x.
Mixed sh Int32 -> Rep (Mixed sh Int32) x
forall x. Rep (Mixed sh Int32) x -> Mixed sh Int32
forall x. Mixed sh Int32 -> Rep (Mixed sh Int32) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x.
Mixed sh Int32 -> Rep (Mixed sh Int32) x
from :: forall x. Mixed sh Int32 -> Rep (Mixed sh Int32) x
$cto :: forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Int32) x -> Mixed sh Int32
to :: forall x. Rep (Mixed sh Int32) x -> Mixed sh Int32
Generic ANDSHOW)
newtype instance Mixed sh CInt = M_CInt (Mixed sh (Primitive CInt)) deriving (Mixed sh CInt -> Mixed sh CInt -> Bool
(Mixed sh CInt -> Mixed sh CInt -> Bool)
-> (Mixed sh CInt -> Mixed sh CInt -> Bool) -> Eq (Mixed sh CInt)
forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
== :: Mixed sh CInt -> Mixed sh CInt -> Bool
$c/= :: forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
/= :: Mixed sh CInt -> Mixed sh CInt -> Bool
Eq, Eq (Mixed sh CInt)
Eq (Mixed sh CInt) =>
(Mixed sh CInt -> Mixed sh CInt -> Ordering)
-> (Mixed sh CInt -> Mixed sh CInt -> Bool)
-> (Mixed sh CInt -> Mixed sh CInt -> Bool)
-> (Mixed sh CInt -> Mixed sh CInt -> Bool)
-> (Mixed sh CInt -> Mixed sh CInt -> Bool)
-> (Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt)
-> (Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt)
-> Ord (Mixed sh CInt)
Mixed sh CInt -> Mixed sh CInt -> Bool
Mixed sh CInt -> Mixed sh CInt -> Ordering
Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt
forall (sh :: [Maybe Nat]). Eq (Mixed sh CInt)
forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh CInt -> Mixed sh CInt -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh CInt -> Mixed sh CInt -> Ordering
compare :: Mixed sh CInt -> Mixed sh CInt -> Ordering
$c< :: forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
< :: Mixed sh CInt -> Mixed sh CInt -> Bool
$c<= :: forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
<= :: Mixed sh CInt -> Mixed sh CInt -> Bool
$c> :: forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
> :: Mixed sh CInt -> Mixed sh CInt -> Bool
$c>= :: forall (sh :: [Maybe Nat]). Mixed sh CInt -> Mixed sh CInt -> Bool
>= :: Mixed sh CInt -> Mixed sh CInt -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt
max :: Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt
min :: Mixed sh CInt -> Mixed sh CInt -> Mixed sh CInt
Ord, (forall x. Mixed sh CInt -> Rep (Mixed sh CInt) x)
-> (forall x. Rep (Mixed sh CInt) x -> Mixed sh CInt)
-> Generic (Mixed sh CInt)
forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh CInt) x -> Mixed sh CInt
forall (sh :: [Maybe Nat]) x.
Mixed sh CInt -> Rep (Mixed sh CInt) x
forall x. Rep (Mixed sh CInt) x -> Mixed sh CInt
forall x. Mixed sh CInt -> Rep (Mixed sh CInt) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x.
Mixed sh CInt -> Rep (Mixed sh CInt) x
from :: forall x. Mixed sh CInt -> Rep (Mixed sh CInt) x
$cto :: forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh CInt) x -> Mixed sh CInt
to :: forall x. Rep (Mixed sh CInt) x -> Mixed sh CInt
Generic ANDSHOW)
newtype instance Mixed sh Float = M_Float (Mixed sh (Primitive Float)) deriving (Mixed sh Float -> Mixed sh Float -> Bool
(Mixed sh Float -> Mixed sh Float -> Bool)
-> (Mixed sh Float -> Mixed sh Float -> Bool)
-> Eq (Mixed sh Float)
forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
== :: Mixed sh Float -> Mixed sh Float -> Bool
$c/= :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
/= :: Mixed sh Float -> Mixed sh Float -> Bool
Eq, Eq (Mixed sh Float)
Eq (Mixed sh Float) =>
(Mixed sh Float -> Mixed sh Float -> Ordering)
-> (Mixed sh Float -> Mixed sh Float -> Bool)
-> (Mixed sh Float -> Mixed sh Float -> Bool)
-> (Mixed sh Float -> Mixed sh Float -> Bool)
-> (Mixed sh Float -> Mixed sh Float -> Bool)
-> (Mixed sh Float -> Mixed sh Float -> Mixed sh Float)
-> (Mixed sh Float -> Mixed sh Float -> Mixed sh Float)
-> Ord (Mixed sh Float)
Mixed sh Float -> Mixed sh Float -> Bool
Mixed sh Float -> Mixed sh Float -> Ordering
Mixed sh Float -> Mixed sh Float -> Mixed sh Float
forall (sh :: [Maybe Nat]). Eq (Mixed sh Float)
forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Mixed sh Float
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Ordering
compare :: Mixed sh Float -> Mixed sh Float -> Ordering
$c< :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
< :: Mixed sh Float -> Mixed sh Float -> Bool
$c<= :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
<= :: Mixed sh Float -> Mixed sh Float -> Bool
$c> :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
> :: Mixed sh Float -> Mixed sh Float -> Bool
$c>= :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Bool
>= :: Mixed sh Float -> Mixed sh Float -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Mixed sh Float
max :: Mixed sh Float -> Mixed sh Float -> Mixed sh Float
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh Float -> Mixed sh Float -> Mixed sh Float
min :: Mixed sh Float -> Mixed sh Float -> Mixed sh Float
Ord, (forall x. Mixed sh Float -> Rep (Mixed sh Float) x)
-> (forall x. Rep (Mixed sh Float) x -> Mixed sh Float)
-> Generic (Mixed sh Float)
forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Float) x -> Mixed sh Float
forall (sh :: [Maybe Nat]) x.
Mixed sh Float -> Rep (Mixed sh Float) x
forall x. Rep (Mixed sh Float) x -> Mixed sh Float
forall x. Mixed sh Float -> Rep (Mixed sh Float) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x.
Mixed sh Float -> Rep (Mixed sh Float) x
from :: forall x. Mixed sh Float -> Rep (Mixed sh Float) x
$cto :: forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Float) x -> Mixed sh Float
to :: forall x. Rep (Mixed sh Float) x -> Mixed sh Float
Generic ANDSHOW)
newtype instance Mixed sh Double = M_Double (Mixed sh (Primitive Double)) deriving (Mixed sh Double -> Mixed sh Double -> Bool
(Mixed sh Double -> Mixed sh Double -> Bool)
-> (Mixed sh Double -> Mixed sh Double -> Bool)
-> Eq (Mixed sh Double)
forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
== :: Mixed sh Double -> Mixed sh Double -> Bool
$c/= :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
/= :: Mixed sh Double -> Mixed sh Double -> Bool
Eq, Eq (Mixed sh Double)
Eq (Mixed sh Double) =>
(Mixed sh Double -> Mixed sh Double -> Ordering)
-> (Mixed sh Double -> Mixed sh Double -> Bool)
-> (Mixed sh Double -> Mixed sh Double -> Bool)
-> (Mixed sh Double -> Mixed sh Double -> Bool)
-> (Mixed sh Double -> Mixed sh Double -> Bool)
-> (Mixed sh Double -> Mixed sh Double -> Mixed sh Double)
-> (Mixed sh Double -> Mixed sh Double -> Mixed sh Double)
-> Ord (Mixed sh Double)
Mixed sh Double -> Mixed sh Double -> Bool
Mixed sh Double -> Mixed sh Double -> Ordering
Mixed sh Double -> Mixed sh Double -> Mixed sh Double
forall (sh :: [Maybe Nat]). Eq (Mixed sh Double)
forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Mixed sh Double
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Ordering
compare :: Mixed sh Double -> Mixed sh Double -> Ordering
$c< :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
< :: Mixed sh Double -> Mixed sh Double -> Bool
$c<= :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
<= :: Mixed sh Double -> Mixed sh Double -> Bool
$c> :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
> :: Mixed sh Double -> Mixed sh Double -> Bool
$c>= :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Bool
>= :: Mixed sh Double -> Mixed sh Double -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Mixed sh Double
max :: Mixed sh Double -> Mixed sh Double -> Mixed sh Double
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh Double -> Mixed sh Double -> Mixed sh Double
min :: Mixed sh Double -> Mixed sh Double -> Mixed sh Double
Ord, (forall x. Mixed sh Double -> Rep (Mixed sh Double) x)
-> (forall x. Rep (Mixed sh Double) x -> Mixed sh Double)
-> Generic (Mixed sh Double)
forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Double) x -> Mixed sh Double
forall (sh :: [Maybe Nat]) x.
Mixed sh Double -> Rep (Mixed sh Double) x
forall x. Rep (Mixed sh Double) x -> Mixed sh Double
forall x. Mixed sh Double -> Rep (Mixed sh Double) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x.
Mixed sh Double -> Rep (Mixed sh Double) x
from :: forall x. Mixed sh Double -> Rep (Mixed sh Double) x
$cto :: forall (sh :: [Maybe Nat]) x.
Rep (Mixed sh Double) x -> Mixed sh Double
to :: forall x. Rep (Mixed sh Double) x -> Mixed sh Double
Generic ANDSHOW)
newtype instance Mixed sh () = M_Nil (Mixed sh (Primitive ())) deriving (Mixed sh () -> Mixed sh () -> Bool
(Mixed sh () -> Mixed sh () -> Bool)
-> (Mixed sh () -> Mixed sh () -> Bool) -> Eq (Mixed sh ())
forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
== :: Mixed sh () -> Mixed sh () -> Bool
$c/= :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
/= :: Mixed sh () -> Mixed sh () -> Bool
Eq, Eq (Mixed sh ())
Eq (Mixed sh ()) =>
(Mixed sh () -> Mixed sh () -> Ordering)
-> (Mixed sh () -> Mixed sh () -> Bool)
-> (Mixed sh () -> Mixed sh () -> Bool)
-> (Mixed sh () -> Mixed sh () -> Bool)
-> (Mixed sh () -> Mixed sh () -> Bool)
-> (Mixed sh () -> Mixed sh () -> Mixed sh ())
-> (Mixed sh () -> Mixed sh () -> Mixed sh ())
-> Ord (Mixed sh ())
Mixed sh () -> Mixed sh () -> Bool
Mixed sh () -> Mixed sh () -> Ordering
Mixed sh () -> Mixed sh () -> Mixed sh ()
forall (sh :: [Maybe Nat]). Eq (Mixed sh ())
forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Ordering
forall (sh :: [Maybe Nat]).
Mixed sh () -> Mixed sh () -> Mixed sh ()
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Ordering
compare :: Mixed sh () -> Mixed sh () -> Ordering
$c< :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
< :: Mixed sh () -> Mixed sh () -> Bool
$c<= :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
<= :: Mixed sh () -> Mixed sh () -> Bool
$c> :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
> :: Mixed sh () -> Mixed sh () -> Bool
$c>= :: forall (sh :: [Maybe Nat]). Mixed sh () -> Mixed sh () -> Bool
>= :: Mixed sh () -> Mixed sh () -> Bool
$cmax :: forall (sh :: [Maybe Nat]).
Mixed sh () -> Mixed sh () -> Mixed sh ()
max :: Mixed sh () -> Mixed sh () -> Mixed sh ()
$cmin :: forall (sh :: [Maybe Nat]).
Mixed sh () -> Mixed sh () -> Mixed sh ()
min :: Mixed sh () -> Mixed sh () -> Mixed sh ()
Ord, (forall x. Mixed sh () -> Rep (Mixed sh ()) x)
-> (forall x. Rep (Mixed sh ()) x -> Mixed sh ())
-> Generic (Mixed sh ())
forall (sh :: [Maybe Nat]) x. Rep (Mixed sh ()) x -> Mixed sh ()
forall (sh :: [Maybe Nat]) x. Mixed sh () -> Rep (Mixed sh ()) x
forall x. Rep (Mixed sh ()) x -> Mixed sh ()
forall x. Mixed sh () -> Rep (Mixed sh ()) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) x. Mixed sh () -> Rep (Mixed sh ()) x
from :: forall x. Mixed sh () -> Rep (Mixed sh ()) x
$cto :: forall (sh :: [Maybe Nat]) x. Rep (Mixed sh ()) x -> Mixed sh ()
to :: forall x. Rep (Mixed sh ()) x -> Mixed sh ()
Generic ANDSHOW)  -- no content, orthotope optimises this (via Vector)
-- etc.

data instance Mixed sh (a, b) = M_Tup2 !(Mixed sh a) !(Mixed sh b) deriving ((forall x. Mixed sh (a, b) -> Rep (Mixed sh (a, b)) x)
-> (forall x. Rep (Mixed sh (a, b)) x -> Mixed sh (a, b))
-> Generic (Mixed sh (a, b))
forall (sh :: [Maybe Nat]) a b x.
Rep (Mixed sh (a, b)) x -> Mixed sh (a, b)
forall (sh :: [Maybe Nat]) a b x.
Mixed sh (a, b) -> Rep (Mixed sh (a, b)) x
forall x. Rep (Mixed sh (a, b)) x -> Mixed sh (a, b)
forall x. Mixed sh (a, b) -> Rep (Mixed sh (a, b)) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh :: [Maybe Nat]) a b x.
Mixed sh (a, b) -> Rep (Mixed sh (a, b)) x
from :: forall x. Mixed sh (a, b) -> Rep (Mixed sh (a, b)) x
$cto :: forall (sh :: [Maybe Nat]) a b x.
Rep (Mixed sh (a, b)) x -> Mixed sh (a, b)
to :: forall x. Rep (Mixed sh (a, b)) x -> Mixed sh (a, b)
Generic)
#ifdef OXAR_DEFAULT_SHOW_INSTANCES
deriving instance (Show (Mixed sh a), Show (Mixed sh b)) => Show (Mixed sh (a, b))
#endif
-- etc., larger tuples (perhaps use generics to allow arbitrary product types)

deriving instance (Eq (Mixed sh a), Eq (Mixed sh b)) => Eq (Mixed sh (a, b))
deriving instance (Ord (Mixed sh a), Ord (Mixed sh b)) => Ord (Mixed sh (a, b))

data instance Mixed sh1 (Mixed sh2 a) = M_Nest !(IShX sh1) !(Mixed (sh1 ++ sh2) a) deriving ((forall x.
 Mixed sh1 (Mixed sh2 a) -> Rep (Mixed sh1 (Mixed sh2 a)) x)
-> (forall x.
    Rep (Mixed sh1 (Mixed sh2 a)) x -> Mixed sh1 (Mixed sh2 a))
-> Generic (Mixed sh1 (Mixed sh2 a))
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a x.
Rep (Mixed sh1 (Mixed sh2 a)) x -> Mixed sh1 (Mixed sh2 a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a x.
Mixed sh1 (Mixed sh2 a) -> Rep (Mixed sh1 (Mixed sh2 a)) x
forall x.
Rep (Mixed sh1 (Mixed sh2 a)) x -> Mixed sh1 (Mixed sh2 a)
forall x.
Mixed sh1 (Mixed sh2 a) -> Rep (Mixed sh1 (Mixed sh2 a)) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a x.
Mixed sh1 (Mixed sh2 a) -> Rep (Mixed sh1 (Mixed sh2 a)) x
from :: forall x.
Mixed sh1 (Mixed sh2 a) -> Rep (Mixed sh1 (Mixed sh2 a)) x
$cto :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a x.
Rep (Mixed sh1 (Mixed sh2 a)) x -> Mixed sh1 (Mixed sh2 a)
to :: forall x.
Rep (Mixed sh1 (Mixed sh2 a)) x -> Mixed sh1 (Mixed sh2 a)
Generic)
#ifdef OXAR_DEFAULT_SHOW_INSTANCES
deriving instance (Show (Mixed (sh1 ++ sh2) a)) => Show (Mixed sh1 (Mixed sh2 a))
#endif

deriving instance Eq (Mixed (sh1 ++ sh2) a) => Eq (Mixed sh1 (Mixed sh2 a))
deriving instance Ord (Mixed (sh1 ++ sh2) a) => Ord (Mixed sh1 (Mixed sh2 a))


-- | Internal helper data family mirroring 'Mixed' that consists of mutable
-- vectors instead of 'XArray's.
type MixedVecs :: Type -> [Maybe Nat] -> Type -> Type
data family MixedVecs s sh a

newtype instance MixedVecs s sh (Primitive a) = MV_Primitive (VS.MVector s a)

-- [PRIMITIVE ELEMENT TYPES LIST]
newtype instance MixedVecs s sh Bool = MV_Bool (VS.MVector s Bool)
newtype instance MixedVecs s sh Int = MV_Int (VS.MVector s Int)
newtype instance MixedVecs s sh Int64 = MV_Int64 (VS.MVector s Int64)
newtype instance MixedVecs s sh Int32 = MV_Int32 (VS.MVector s Int32)
newtype instance MixedVecs s sh CInt = MV_CInt (VS.MVector s CInt)
newtype instance MixedVecs s sh Double = MV_Double (VS.MVector s Double)
newtype instance MixedVecs s sh Float = MV_Float (VS.MVector s Float)
newtype instance MixedVecs s sh () = MV_Nil (VS.MVector s ())  -- no content, MVector optimises this
-- etc.

data instance MixedVecs s sh (a, b) = MV_Tup2 !(MixedVecs s sh a) !(MixedVecs s sh b)
-- etc.

data instance MixedVecs s sh1 (Mixed sh2 a) = MV_Nest !(IShX sh2) !(MixedVecs s (sh1 ++ sh2) a)


showsMixedArray :: (Show a, Elt a)
                => String  -- ^ fromList prefix: e.g. @rfromListLinear [2,3]@
                -> String  -- ^ replicate prefix: e.g. @rreplicate [2,3]@
                -> Int -> Mixed sh a -> ShowS
showsMixedArray :: forall a (sh :: [Maybe Nat]).
(Show a, Elt a) =>
String -> String -> Int -> Mixed sh a -> ShowS
showsMixedArray String
fromlistPrefix String
replicatePrefix Int
d Mixed sh a
arr =
  Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
    -- TODO: to avoid ambiguity, we should type-apply the shape to mfromListLinear here
    case Mixed sh a -> [a]
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> [a]
mtoListLinear Mixed sh a
arr of
      a
hd : a
_ : [a]
_
        | ([Int] -> Bool) -> Bag [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ((Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) ([Int] -> Bool) -> ([Int] -> [Int]) -> [Int] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
take (ShX sh Int -> Int
forall (sh :: [Maybe Nat]) i. ShX sh i -> Int
shxLength (Mixed sh a -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
arr))) (Mixed sh a -> Bag [Int]
forall (sh :: [Maybe Nat]). Mixed sh a -> Bag [Int]
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> Bag [Int]
marrayStrides Mixed sh a
arr) ->
            String -> ShowS
showString String
replicatePrefix ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 a
hd
      [a]
_ ->
       String -> ShowS
showString String
fromlistPrefix ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> ShowS
forall a. Show a => a -> ShowS
shows (Mixed sh a -> [a]
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> [a]
mtoListLinear Mixed sh a
arr)

#ifndef OXAR_DEFAULT_SHOW_INSTANCES
instance (Show a, Elt a) => Show (Mixed sh a) where
  showsPrec :: Int -> Mixed sh a -> ShowS
showsPrec Int
d Mixed sh a
arr =
    let sh :: String
sh = [Int] -> String
forall a. Show a => a -> String
show (IShX sh -> [Int]
forall (sh :: [Maybe Nat]). IShX sh -> [Int]
shxToList (Mixed sh a -> IShX sh
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
arr))
    in String -> String -> Int -> Mixed sh a -> ShowS
forall a (sh :: [Maybe Nat]).
(Show a, Elt a) =>
String -> String -> Int -> Mixed sh a -> ShowS
showsMixedArray (String
"mfromListLinear " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
sh) (String
"mreplicate " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
sh) Int
d Mixed sh a
arr
#endif

instance Elt a => NFData (Mixed sh a) where
  rnf :: Mixed sh a -> ()
rnf = Mixed sh a -> ()
forall (sh :: [Maybe Nat]). Mixed sh a -> ()
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> ()
mrnf


mliftNumElt1 :: (PrimElt a, PrimElt b)
             => (SNat (Rank sh) -> S.Array (Rank sh) a -> S.Array (Rank sh) b)
             -> Mixed sh a -> Mixed sh b
mliftNumElt1 :: forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b
f (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh (XArray Array (Rank sh) a
arr)) = Mixed sh (Primitive b) -> Mixed sh b
forall (sh :: [Maybe Nat]). Mixed sh (Primitive b) -> Mixed sh b
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive b) -> Mixed sh b)
-> Mixed sh (Primitive b) -> Mixed sh b
forall a b. (a -> b) -> a -> b
$ IShX sh -> XArray sh b -> Mixed sh (Primitive b)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (Array (Rank sh) b -> XArray sh b
forall (sh :: [Maybe Nat]) a. Array (Rank sh) a -> XArray sh a
XArray (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b
f (IShX sh -> SNat (Rank sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> SNat (Rank sh)
shxRank IShX sh
sh) Array (Rank sh) a
arr))

mliftNumElt2 :: (PrimElt a, PrimElt b, PrimElt c)
             => (SNat (Rank sh) -> S.Array (Rank sh) a -> S.Array (Rank sh) b -> S.Array (Rank sh) c)
             -> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 :: forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c
f (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh1 (XArray Array (Rank sh) a
arr1)) (Mixed sh b -> Mixed sh (Primitive b)
forall (sh :: [Maybe Nat]). Mixed sh b -> Mixed sh (Primitive b)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh2 (XArray Array (Rank sh) b
arr2))
  | IShX sh
sh1 IShX sh -> IShX sh -> Bool
forall a. Eq a => a -> a -> Bool
== IShX sh
sh2 = Mixed sh (Primitive c) -> Mixed sh c
forall (sh :: [Maybe Nat]). Mixed sh (Primitive c) -> Mixed sh c
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive c) -> Mixed sh c)
-> Mixed sh (Primitive c) -> Mixed sh c
forall a b. (a -> b) -> a -> b
$ IShX sh -> XArray sh c -> Mixed sh (Primitive c)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh1 (Array (Rank sh) c -> XArray sh c
forall (sh :: [Maybe Nat]) a. Array (Rank sh) a -> XArray sh a
XArray (SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c
f (IShX sh -> SNat (Rank sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> SNat (Rank sh)
shxRank IShX sh
sh1) Array (Rank sh) a
arr1 Array (Rank sh) b
arr2))
  | Bool
otherwise = String -> Mixed sh c
forall a. HasCallStack => String -> a
error (String -> Mixed sh c) -> String -> Mixed sh c
forall a b. (a -> b) -> a -> b
$ String
"Data.Array.Nested: Shapes unequal in elementwise Num operation: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ IShX sh -> String
forall a. Show a => a -> String
show IShX sh
sh1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" vs " String -> ShowS
forall a. [a] -> [a] -> [a]
++ IShX sh -> String
forall a. Show a => a -> String
show IShX sh
sh2

instance (NumElt a, PrimElt a) => Num (Mixed sh a) where
  + :: Mixed sh a -> Mixed sh a -> Mixed sh a
(+) = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
NumElt a =>
SNat n -> Array n a -> Array n a -> Array n a
numEltAdd)
  (-) = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
NumElt a =>
SNat n -> Array n a -> Array n a -> Array n a
numEltSub)
  * :: Mixed sh a -> Mixed sh a -> Mixed sh a
(*) = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
NumElt a =>
SNat n -> Array n a -> Array n a -> Array n a
numEltMul)
  negate :: Mixed sh a -> Mixed sh a
negate = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). NumElt a => SNat n -> Array n a -> Array n a
numEltNeg)
  abs :: Mixed sh a -> Mixed sh a
abs = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). NumElt a => SNat n -> Array n a -> Array n a
numEltAbs)
  signum :: Mixed sh a -> Mixed sh a
signum = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). NumElt a => SNat n -> Array n a -> Array n a
numEltSignum)
  -- TODO: THIS IS BAD, WE NEED TO REMOVE THIS
  fromInteger :: Integer -> Mixed sh a
fromInteger = String -> Integer -> Mixed sh a
forall a. HasCallStack => String -> a
error String
"Data.Array.Nested.fromInteger: Cannot implement fromInteger, use mreplicateScal"

instance (FloatElt a, PrimElt a) => Fractional (Mixed sh a) where
  fromRational :: Rational -> Mixed sh a
fromRational Rational
_ = String -> Mixed sh a
forall a. HasCallStack => String -> a
error String
"Data.Array.Nested.fromRational: No singletons available, use explicit mreplicate"
  recip :: Mixed sh a -> Mixed sh a
recip = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltRecip)
  / :: Mixed sh a -> Mixed sh a -> Mixed sh a
(/) = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
FloatElt a =>
SNat n -> Array n a -> Array n a -> Array n a
floatEltDiv)

instance (FloatElt a, PrimElt a) => Floating (Mixed sh a) where
  pi :: Mixed sh a
pi = String -> Mixed sh a
forall a. HasCallStack => String -> a
error String
"Data.Array.Nested.pi: No singletons available, use explicit mreplicate"
  exp :: Mixed sh a -> Mixed sh a
exp = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltExp)
  log :: Mixed sh a -> Mixed sh a
log = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltLog)
  sqrt :: Mixed sh a -> Mixed sh a
sqrt = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltSqrt)

  ** :: Mixed sh a -> Mixed sh a -> Mixed sh a
(**) = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
FloatElt a =>
SNat n -> Array n a -> Array n a -> Array n a
floatEltPow)
  logBase :: Mixed sh a -> Mixed sh a -> Mixed sh a
logBase = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
FloatElt a =>
SNat n -> Array n a -> Array n a -> Array n a
floatEltLogbase)

  sin :: Mixed sh a -> Mixed sh a
sin = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltSin)
  cos :: Mixed sh a -> Mixed sh a
cos = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltCos)
  tan :: Mixed sh a -> Mixed sh a
tan = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltTan)
  asin :: Mixed sh a -> Mixed sh a
asin = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltAsin)
  acos :: Mixed sh a -> Mixed sh a
acos = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltAcos)
  atan :: Mixed sh a -> Mixed sh a
atan = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltAtan)
  sinh :: Mixed sh a -> Mixed sh a
sinh = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltSinh)
  cosh :: Mixed sh a -> Mixed sh a
cosh = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltCosh)
  tanh :: Mixed sh a -> Mixed sh a
tanh = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltTanh)
  asinh :: Mixed sh a -> Mixed sh a
asinh = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltAsinh)
  acosh :: Mixed sh a -> Mixed sh a
acosh = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltAcosh)
  atanh :: Mixed sh a -> Mixed sh a
atanh = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltAtanh)
  log1p :: Mixed sh a -> Mixed sh a
log1p = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltLog1p)
  expm1 :: Mixed sh a -> Mixed sh a
expm1 = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltExpm1)
  log1pexp :: Mixed sh a -> Mixed sh a
log1pexp = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltLog1pexp)
  log1mexp :: Mixed sh a -> Mixed sh a
log1mexp = (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a
forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) b)
-> Mixed sh a -> Mixed sh b
mliftNumElt1 ((Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n' :: Nat) b.
(Array n a -> Array n' b) -> Array n a -> Array n' b
liftO1 ((Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh) -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a
forall a (n :: Nat). FloatElt a => SNat n -> Array n a -> Array n a
floatEltLog1mexp)

mquotArray, mremArray :: (IntElt a, PrimElt a) => Mixed sh a -> Mixed sh a -> Mixed sh a
mquotArray :: forall a (sh :: [Maybe Nat]).
(IntElt a, PrimElt a) =>
Mixed sh a -> Mixed sh a -> Mixed sh a
mquotArray = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
IntElt a =>
SNat n -> Array n a -> Array n a -> Array n a
intEltQuot)
mremArray :: forall a (sh :: [Maybe Nat]).
(IntElt a, PrimElt a) =>
Mixed sh a -> Mixed sh a -> Mixed sh a
mremArray = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
IntElt a =>
SNat n -> Array n a -> Array n a -> Array n a
intEltRem)

matan2Array :: (FloatElt a, PrimElt a) => Mixed sh a -> Mixed sh a -> Mixed sh a
matan2Array :: forall a (sh :: [Maybe Nat]).
(FloatElt a, PrimElt a) =>
Mixed sh a -> Mixed sh a -> Mixed sh a
matan2Array = (SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Mixed sh a -> Mixed sh a -> Mixed sh a
forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(SNat (Rank sh)
 -> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c)
-> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftNumElt2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 ((Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
 -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> (SNat (Rank sh)
    -> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a)
-> SNat (Rank sh)
-> Array (Rank sh) a
-> Array (Rank sh) a
-> Array (Rank sh) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat (Rank sh)
-> Array (Rank sh) a -> Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat). SNat n -> Array n a -> Array n a -> Array n a
forall a (n :: Nat).
FloatElt a =>
SNat n -> Array n a -> Array n a -> Array n a
floatEltAtan2)

-- | Allowable element types in a mixed array, and by extension in a 'Ranked' or
-- 'Shaped' array. Note the polymorphic instance for 'Elt' of @'Primitive'
-- a@; see the documentation for 'Primitive' for more details.
class Elt a where
  -- ====== PUBLIC METHODS ====== --

  mshape :: Mixed sh a -> IShX sh
  mindex :: Mixed sh a -> IIxX sh -> a
  mindexPartial :: forall sh sh'. Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
  mscalar :: a -> Mixed '[] a

  -- | All arrays in the list, even subarrays inside @a@, must have the same
  -- shape; if they do not, a runtime error will be thrown. See the
  -- documentation of 'mgenerate' for more information about this restriction.
  -- Furthermore, the length of the list must correspond with @n@: if @n@ is
  -- @Just m@ and @m@ does not equal the length of the list, a runtime error is
  -- thrown.
  --
  -- Consider also 'mfromListPrim', which can avoid intermediate arrays.
  mfromListOuter :: forall sh. NonEmpty (Mixed sh a) -> Mixed (Nothing : sh) a

  mtoListOuter :: Mixed (n : sh) a -> [Mixed sh a]

  -- | Note: this library makes no particular guarantees about the shapes of
  -- arrays "inside" an empty array. With 'mlift', 'mlift2' and 'mliftL' you can see the
  -- full 'XArray' and as such you can distinguish different empty arrays by
  -- the "shapes" of their elements. This information is meaningless, so you
  -- should not use it.
  mlift :: forall sh1 sh2.
           StaticShX sh2
        -> (forall sh' b. Storable b => StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
        -> Mixed sh1 a -> Mixed sh2 a

  -- | See the documentation for 'mlift'.
  mlift2 :: forall sh1 sh2 sh3.
            StaticShX sh3
         -> (forall sh' b. Storable b => StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b -> XArray (sh3 ++ sh') b)
         -> Mixed sh1 a -> Mixed sh2 a -> Mixed sh3 a

  -- TODO: mliftL is currently unused.
  -- | All arrays in the input must have equal shapes, including subarrays
  -- inside their elements.
  mliftL :: forall sh1 sh2.
            StaticShX sh2
         -> (forall sh' b. Storable b => StaticShX sh' -> NonEmpty (XArray (sh1 ++ sh') b) -> NonEmpty (XArray (sh2 ++ sh') b))
         -> NonEmpty (Mixed sh1 a) -> NonEmpty (Mixed sh2 a)

  mcastPartial :: forall sh1 sh2 sh'. Rank sh1 ~ Rank sh2
               => StaticShX sh1 -> StaticShX sh2 -> Proxy sh' -> Mixed (sh1 ++ sh') a -> Mixed (sh2 ++ sh') a

  mtranspose :: forall is sh. (IsPermutation is, Rank is <= Rank sh)
             => Perm is -> Mixed sh a -> Mixed (PermutePrefix is sh) a

  -- | All arrays in the input must have equal shapes, including subarrays
  -- inside their elements.
  mconcat :: NonEmpty (Mixed (Nothing : sh) a) -> Mixed (Nothing : sh) a

  mrnf :: Mixed sh a -> ()

  -- ====== PRIVATE METHODS ====== --

  -- | Tree giving the shape of every array component.
  type ShapeTree a

  mshapeTree :: a -> ShapeTree a

  mshapeTreeEq :: Proxy a -> ShapeTree a -> ShapeTree a -> Bool

  mshapeTreeEmpty :: Proxy a -> ShapeTree a -> Bool

  mshowShapeTree :: Proxy a -> ShapeTree a -> String

  -- | Returns the stride vector of each underlying component array making up
  -- this mixed array.
  marrayStrides :: Mixed sh a -> Bag [Int]

  -- | Given the shape of this array, an index and a value, write the value at
  -- that index in the vectors.
  mvecsWrite :: IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()

  -- | Given the shape of this array, an index and a value, write the value at
  -- that index in the vectors.
  mvecsWritePartial :: IShX (sh ++ sh') -> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()

  -- | Given the shape of this array, finalise the vectors into 'XArray's.
  mvecsFreeze :: IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)


-- | Element types for which we have evidence of the (static part of the) shape
-- in a type class constraint. Compare the instance contexts of the instances
-- of this class with those of 'Elt': some instances have an additional
-- "known-shape" constraint.
--
-- This class is (currently) only required for `memptyArray` and 'mgenerate'.
class Elt a => KnownElt a where
  -- | Create an empty array. The given shape must have size zero; this may or may not be checked.
  memptyArrayUnsafe :: IShX sh -> Mixed sh a

  -- | Create uninitialised vectors for this array type, given the shape of
  -- this vector and an example for the contents.
  mvecsUnsafeNew :: IShX sh -> a -> ST s (MixedVecs s sh a)

  mvecsNewEmpty :: Proxy a -> ST s (MixedVecs s sh a)


-- Arrays of scalars are basically just arrays of scalars.
instance Storable a => Elt (Primitive a) where
  mshape :: forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> IShX sh
mshape (M_Primitive IShX sh
sh XArray sh a
_) = IShX sh
sh
  mindex :: forall (sh :: [Maybe Nat]).
Mixed sh (Primitive a) -> IIxX sh -> Primitive a
mindex (M_Primitive IShX sh
_ XArray sh a
a) IIxX sh
i = a -> Primitive a
forall a. a -> Primitive a
Primitive (XArray sh a -> IIxX sh -> a
forall (sh :: [Maybe Nat]) a.
Storable a =>
XArray sh a -> IIxX sh -> a
X.index XArray sh a
a IIxX sh
i)
  mindexPartial :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Mixed (sh ++ sh') (Primitive a)
-> IIxX sh -> Mixed sh' (Primitive a)
mindexPartial (M_Primitive IShX (sh ++ sh')
sh XArray (sh ++ sh') a
a) IIxX sh
i = IShX sh' -> XArray sh' a -> Mixed sh' (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (IIxX sh -> IShX (sh ++ sh') -> IShX sh'
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i j.
IxX sh j -> ShX (sh ++ sh') i -> ShX sh' i
shxDropIx IIxX sh
i IShX (sh ++ sh')
sh) (XArray (sh ++ sh') a -> IIxX sh -> XArray sh' a
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Storable a =>
XArray (sh ++ sh') a -> IIxX sh -> XArray sh' a
X.indexPartial XArray (sh ++ sh') a
a IIxX sh
i)
  mscalar :: Primitive a -> Mixed '[] (Primitive a)
mscalar (Primitive a
x) = IShX '[] -> XArray '[] a -> Mixed '[] (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX '[]
forall (sh :: [Maybe Nat]) i. (sh ~ '[]) => ShX sh i
ZSX (a -> XArray '[] a
forall a. Storable a => a -> XArray '[] a
X.scalar a
x)
  mfromListOuter :: forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh (Primitive a))
-> Mixed ('Nothing : sh) (Primitive a)
mfromListOuter l :: NonEmpty (Mixed sh (Primitive a))
l@(Mixed sh (Primitive a)
arr1 :| [Mixed sh (Primitive a)]
_) =
    let sh :: ShX ('Nothing : sh) Int
sh = Int -> SMayNat Int SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown (NonEmpty (Mixed sh (Primitive a)) -> Int
forall a. NonEmpty a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length NonEmpty (Mixed sh (Primitive a))
l) SMayNat Int SNat 'Nothing -> ShX sh Int -> ShX ('Nothing : sh) Int
forall {sh1 :: [Maybe Nat]} {i} (n :: Maybe Nat)
       (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat i SNat n -> ShX sh i -> ShX sh1 i
:$% Mixed sh (Primitive a) -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh (Primitive a)
arr1
    in ShX ('Nothing : sh) Int
-> XArray ('Nothing : sh) a -> Mixed ('Nothing : sh) (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive ShX ('Nothing : sh) Int
sh (StaticShX ('Nothing : sh)
-> [XArray sh a] -> XArray ('Nothing : sh) a
forall (n :: Maybe Nat) (sh :: [Maybe Nat]) a.
Storable a =>
StaticShX (n : sh) -> [XArray sh a] -> XArray (n : sh) a
X.fromListOuter (ShX ('Nothing : sh) Int -> StaticShX ('Nothing : sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX ('Nothing : sh) Int
sh) ((Mixed sh (Primitive a) -> XArray sh a)
-> [Mixed sh (Primitive a)] -> [XArray sh a]
forall a b. (a -> b) -> [a] -> [b]
map (\(M_Primitive ShX sh Int
_ XArray sh a
a) -> XArray sh a
a) (NonEmpty (Mixed sh (Primitive a)) -> [Mixed sh (Primitive a)]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList NonEmpty (Mixed sh (Primitive a))
l)))
  mtoListOuter :: forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) (Primitive a) -> [Mixed sh (Primitive a)]
mtoListOuter (M_Primitive IShX (n : sh)
sh XArray (n : sh) a
arr) = (XArray sh a -> Mixed sh (Primitive a))
-> [XArray sh a] -> [Mixed sh (Primitive a)]
forall a b. (a -> b) -> [a] -> [b]
map (IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (IShX (n : sh) -> IShX sh
forall (n :: Maybe Nat) (sh :: [Maybe Nat]) i.
ShX (n : sh) i -> ShX sh i
shxTail IShX (n : sh)
sh)) (XArray (n : sh) a -> [XArray sh a]
forall a (n :: Maybe Nat) (sh :: [Maybe Nat]).
Storable a =>
XArray (n : sh) a -> [XArray sh a]
X.toListOuter XArray (n : sh) a
arr)

  mlift :: forall sh1 sh2.
           StaticShX sh2
        -> (StaticShX '[] -> XArray (sh1 ++ '[]) a -> XArray (sh2 ++ '[]) a)
        -> Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive a)
  mlift :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (StaticShX '[]
    -> XArray (sh1 ++ '[]) a -> XArray (sh2 ++ '[]) a)
-> Mixed sh1 (Primitive a)
-> Mixed sh2 (Primitive a)
mlift StaticShX sh2
ssh2 StaticShX '[] -> XArray (sh1 ++ '[]) a -> XArray (sh2 ++ '[]) a
f (M_Primitive IShX sh1
_ XArray sh1 a
a)
    | (sh1 ++ '[]) :~: sh1
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh1
    , (sh2 ++ '[]) :~: sh2
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh2
    , let result :: XArray (sh2 ++ '[]) a
result = StaticShX '[] -> XArray (sh1 ++ '[]) a -> XArray (sh2 ++ '[]) a
f StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX XArray sh1 a
XArray (sh1 ++ '[]) a
a
    = IShX sh2 -> XArray sh2 a -> Mixed sh2 (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (StaticShX sh2 -> XArray sh2 a -> IShX sh2
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape StaticShX sh2
ssh2 XArray sh2 a
XArray (sh2 ++ '[]) a
result) XArray sh2 a
XArray (sh2 ++ '[]) a
result

  mlift2 :: forall sh1 sh2 sh3.
            StaticShX sh3
         -> (StaticShX '[] -> XArray (sh1 ++ '[]) a -> XArray (sh2 ++ '[]) a -> XArray (sh3 ++ '[]) a)
         -> Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive a) -> Mixed sh3 (Primitive a)
  mlift2 :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (StaticShX '[]
    -> XArray (sh1 ++ '[]) a
    -> XArray (sh2 ++ '[]) a
    -> XArray (sh3 ++ '[]) a)
-> Mixed sh1 (Primitive a)
-> Mixed sh2 (Primitive a)
-> Mixed sh3 (Primitive a)
mlift2 StaticShX sh3
ssh3 StaticShX '[]
-> XArray (sh1 ++ '[]) a
-> XArray (sh2 ++ '[]) a
-> XArray (sh3 ++ '[]) a
f (M_Primitive IShX sh1
_ XArray sh1 a
a) (M_Primitive IShX sh2
_ XArray sh2 a
b)
    | (sh1 ++ '[]) :~: sh1
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh1
    , (sh2 ++ '[]) :~: sh2
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh2
    , (sh3 ++ '[]) :~: sh3
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh3
    , let result :: XArray (sh3 ++ '[]) a
result = StaticShX '[]
-> XArray (sh1 ++ '[]) a
-> XArray (sh2 ++ '[]) a
-> XArray (sh3 ++ '[]) a
f StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX XArray sh1 a
XArray (sh1 ++ '[]) a
a XArray sh2 a
XArray (sh2 ++ '[]) a
b
    = IShX sh3 -> XArray sh3 a -> Mixed sh3 (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (StaticShX sh3 -> XArray sh3 a -> IShX sh3
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape StaticShX sh3
ssh3 XArray sh3 a
XArray (sh3 ++ '[]) a
result) XArray sh3 a
XArray (sh3 ++ '[]) a
result

  mliftL :: forall sh1 sh2.
            StaticShX sh2
         -> (forall sh' b. Storable b => StaticShX sh' -> NonEmpty (XArray (sh1 ++ sh') b) -> NonEmpty (XArray (sh2 ++ sh') b))
         -> NonEmpty (Mixed sh1 (Primitive a)) -> NonEmpty (Mixed sh2 (Primitive a))
  mliftL :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 (Primitive a))
-> NonEmpty (Mixed sh2 (Primitive a))
mliftL StaticShX sh2
ssh2 forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
f NonEmpty (Mixed sh1 (Primitive a))
l
    | (sh1 ++ '[]) :~: sh1
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh1
    , (sh2 ++ '[]) :~: sh2
Refl <- forall (l :: [Maybe Nat]). (l ++ '[]) :~: l
forall {a} (l :: [a]). (l ++ '[]) :~: l
lemAppNil @sh2
    = (XArray sh2 a -> Mixed sh2 (Primitive a))
-> NonEmpty (XArray sh2 a) -> NonEmpty (Mixed sh2 (Primitive a))
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\XArray sh2 a
arr -> IShX sh2 -> XArray sh2 a -> Mixed sh2 (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (StaticShX sh2 -> XArray sh2 a -> IShX sh2
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape StaticShX sh2
ssh2 XArray sh2 a
arr) XArray sh2 a
arr) (NonEmpty (XArray sh2 a) -> NonEmpty (Mixed sh2 (Primitive a)))
-> NonEmpty (XArray sh2 a) -> NonEmpty (Mixed sh2 (Primitive a))
forall a b. (a -> b) -> a -> b
$
        StaticShX '[]
-> NonEmpty (XArray (sh1 ++ '[]) a)
-> NonEmpty (XArray (sh2 ++ '[]) a)
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
f StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX ((Mixed sh1 (Primitive a) -> XArray sh1 a)
-> NonEmpty (Mixed sh1 (Primitive a)) -> NonEmpty (XArray sh1 a)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(M_Primitive IShX sh1
_ XArray sh1 a
arr) -> XArray sh1 a
arr) NonEmpty (Mixed sh1 (Primitive a))
l)

  mcastPartial :: forall sh1 sh2 sh'. Rank sh1 ~ Rank sh2
               => StaticShX sh1 -> StaticShX sh2 -> Proxy sh' -> Mixed (sh1 ++ sh') (Primitive a) -> Mixed (sh2 ++ sh') (Primitive a)
  mcastPartial :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') (Primitive a)
-> Mixed (sh2 ++ sh') (Primitive a)
mcastPartial StaticShX sh1
ssh1 StaticShX sh2
ssh2 Proxy sh'
_ (M_Primitive IShX (sh1 ++ sh')
sh1' XArray (sh1 ++ sh') a
arr) =
    let (ShX sh1 Int
sh1, ShX sh' Int
sh') = Proxy sh'
-> StaticShX sh1 -> IShX (sh1 ++ sh') -> (ShX sh1 Int, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') StaticShX sh1
ssh1 IShX (sh1 ++ sh')
sh1'
        sh2 :: IShX sh2
sh2 = StaticShX sh2 -> ShX sh1 Int -> IShX sh2
forall (sh' :: [Maybe Nat]) (sh :: [Maybe Nat]).
StaticShX sh' -> IShX sh -> IShX sh'
shxCast' StaticShX sh2
ssh2 ShX sh1 Int
sh1
    in IShX (sh2 ++ sh')
-> XArray (sh2 ++ sh') a -> Mixed (sh2 ++ sh') (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (IShX sh2 -> ShX sh' Int -> IShX (sh2 ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX sh2
sh2 ShX sh' Int
sh') (StaticShX sh1
-> IShX sh2
-> StaticShX sh'
-> XArray (sh1 ++ sh') a
-> XArray (sh2 ++ sh') a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]) a.
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> IShX sh2
-> StaticShX sh'
-> XArray (sh1 ++ sh') a
-> XArray (sh2 ++ sh') a
X.cast StaticShX sh1
ssh1 IShX sh2
sh2 (ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh' Int
sh') XArray (sh1 ++ sh') a
arr)

  mtranspose :: forall (is :: [Nat]) (sh :: [Maybe Nat]).
(IsPermutation is, Rank is <= Rank sh) =>
Perm is
-> Mixed sh (Primitive a)
-> Mixed (PermutePrefix is sh) (Primitive a)
mtranspose Perm is
perm (M_Primitive IShX sh
sh XArray sh a
arr) =
    IShX (Permute is (TakeLen is sh) ++ DropLen is sh)
-> XArray (Permute is (TakeLen is sh) ++ DropLen is sh) a
-> Mixed
     (Permute is (TakeLen is sh) ++ DropLen is sh) (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (Perm is
-> IShX sh -> IShX (Permute is (TakeLen is sh) ++ DropLen is sh)
forall (is :: [Nat]) (sh :: [Maybe Nat]).
Perm is -> IShX sh -> IShX (PermutePrefix is sh)
shxPermutePrefix Perm is
perm IShX sh
sh)
                (StaticShX sh
-> Perm is
-> XArray sh a
-> XArray (Permute is (TakeLen is sh) ++ DropLen is sh) a
forall (is :: [Nat]) (sh :: [Maybe Nat]) a.
(IsPermutation is, Rank is <= Rank sh) =>
StaticShX sh
-> Perm is -> XArray sh a -> XArray (PermutePrefix is sh) a
X.transpose (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) Perm is
perm XArray sh a
arr)

  mconcat :: forall sh. NonEmpty (Mixed (Nothing : sh) (Primitive a)) -> Mixed (Nothing : sh) (Primitive a)
  mconcat :: forall (sh :: [Maybe Nat]).
NonEmpty (Mixed ('Nothing : sh) (Primitive a))
-> Mixed ('Nothing : sh) (Primitive a)
mconcat l :: NonEmpty (Mixed ('Nothing : sh) (Primitive a))
l@(M_Primitive (SMayNat Int SNat n
_ :$% ShX sh Int
sh) XArray ('Nothing : sh) a
_ :| [Mixed ('Nothing : sh) (Primitive a)]
_) =
    let result :: XArray ('Nothing : sh) a
result = StaticShX sh
-> NonEmpty (XArray ('Nothing : sh) a) -> XArray ('Nothing : sh) a
forall a (sh :: [Maybe Nat]).
Storable a =>
StaticShX sh
-> NonEmpty (XArray ('Nothing : sh) a) -> XArray ('Nothing : sh) a
X.concat (ShX sh Int -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh Int
sh) ((Mixed ('Nothing : sh) (Primitive a) -> XArray ('Nothing : sh) a)
-> NonEmpty (Mixed ('Nothing : sh) (Primitive a))
-> NonEmpty (XArray ('Nothing : sh) a)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(M_Primitive IShX ('Nothing : sh)
_ XArray ('Nothing : sh) a
arr) -> XArray ('Nothing : sh) a
arr) NonEmpty (Mixed ('Nothing : sh) (Primitive a))
NonEmpty (Mixed ('Nothing : sh) (Primitive a))
l)
    in ShX ('Nothing : sh) Int
-> XArray ('Nothing : sh) a -> Mixed ('Nothing : sh) (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (StaticShX ('Nothing : sh)
-> XArray ('Nothing : sh) a -> ShX ('Nothing : sh) Int
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape (() -> SMayNat () SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown () SMayNat () SNat 'Nothing
-> StaticShX sh -> StaticShX ('Nothing : sh)
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% ShX sh Int -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh Int
sh) XArray ('Nothing : sh) a
XArray ('Nothing : sh) a
result) XArray ('Nothing : sh) a
XArray ('Nothing : sh) a
result

  mrnf :: forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> ()
mrnf (M_Primitive IShX sh
sh XArray sh a
a) = IShX sh -> ()
forall a. NFData a => a -> ()
rnf IShX sh
sh () -> () -> ()
forall a b. a -> b -> b
`seq` XArray sh a -> ()
forall a. NFData a => a -> ()
rnf XArray sh a
a

  type ShapeTree (Primitive a) = ()
  mshapeTree :: Primitive a -> ShapeTree (Primitive a)
mshapeTree Primitive a
_ = ()
  mshapeTreeEq :: Proxy (Primitive a)
-> ShapeTree (Primitive a) -> ShapeTree (Primitive a) -> Bool
mshapeTreeEq Proxy (Primitive a)
_ () () = Bool
True
  mshapeTreeEmpty :: Proxy (Primitive a) -> ShapeTree (Primitive a) -> Bool
mshapeTreeEmpty Proxy (Primitive a)
_ () = Bool
False
  mshowShapeTree :: Proxy (Primitive a) -> ShapeTree (Primitive a) -> String
mshowShapeTree Proxy (Primitive a)
_ () = String
"()"
  marrayStrides :: forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Bag [Int]
marrayStrides (M_Primitive IShX sh
_ XArray sh a
arr) = [Int] -> Bag [Int]
forall a. a -> Bag a
BOne (XArray sh a -> [Int]
forall (sh :: [Maybe Nat]) a. XArray sh a -> [Int]
X.arrayStrides XArray sh a
arr)
  mvecsWrite :: forall (sh :: [Maybe Nat]) s.
IShX sh
-> IIxX sh
-> Primitive a
-> MixedVecs s sh (Primitive a)
-> ST s ()
mvecsWrite IShX sh
sh IIxX sh
i (Primitive a
x) (MV_Primitive MVector s a
v) = MVector (PrimState (ST s)) a -> Int -> a -> ST s ()
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
VSM.write MVector s a
MVector (PrimState (ST s)) a
v (IShX sh -> IIxX sh -> Int
forall (sh :: [Maybe Nat]). IShX sh -> IIxX sh -> Int
ixxToLinear IShX sh
sh IIxX sh
i) a
x

  -- TODO: this use of toVector is suboptimal
  mvecsWritePartial
    :: forall sh' sh s.
       IShX (sh ++ sh') -> IIxX sh -> Mixed sh' (Primitive a) -> MixedVecs s (sh ++ sh') (Primitive a) -> ST s ()
  mvecsWritePartial :: forall (sh' :: [Maybe Nat]) (sh :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh
-> Mixed sh' (Primitive a)
-> MixedVecs s (sh ++ sh') (Primitive a)
-> ST s ()
mvecsWritePartial IShX (sh ++ sh')
sh IIxX sh
i (M_Primitive IShX sh'
sh' XArray sh' a
arr) (MV_Primitive MVector s a
v) = do
    let arrsh :: IShX sh'
arrsh = StaticShX sh' -> XArray sh' a -> IShX sh'
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape (IShX sh' -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh'
sh') XArray sh' a
arr
        offset :: Int
offset = IShX (sh ++ sh') -> IIxX (sh ++ sh') -> Int
forall (sh :: [Maybe Nat]). IShX sh -> IIxX sh -> Int
ixxToLinear IShX (sh ++ sh')
sh (IIxX sh -> IxX sh' Int -> IIxX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
IxX sh i -> IxX sh' i -> IxX (sh ++ sh') i
ixxAppend IIxX sh
i (IShX sh' -> IxX sh' Int
forall (sh :: [Maybe Nat]). IShX sh -> IIxX sh
ixxZero' IShX sh'
arrsh))
    MVector (PrimState (ST s)) a -> Vector a -> ST s ()
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
MVector (PrimState m) a -> Vector a -> m ()
VS.copy (Int -> Int -> MVector s a -> MVector s a
forall a s. Storable a => Int -> Int -> MVector s a -> MVector s a
VSM.slice Int
offset (IShX sh' -> Int
forall (sh :: [Maybe Nat]). IShX sh -> Int
shxSize IShX sh'
arrsh) MVector s a
v) (XArray sh' a -> Vector a
forall a (sh :: [Maybe Nat]). Storable a => XArray sh a -> Vector a
X.toVector XArray sh' a
arr)

  mvecsFreeze :: forall (sh :: [Maybe Nat]) s.
IShX sh
-> MixedVecs s sh (Primitive a) -> ST s (Mixed sh (Primitive a))
mvecsFreeze IShX sh
sh (MV_Primitive MVector s a
v) = IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (XArray sh a -> Mixed sh (Primitive a))
-> (Vector a -> XArray sh a) -> Vector a -> Mixed sh (Primitive a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IShX sh -> Vector a -> XArray sh a
forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> Vector a -> XArray sh a
X.fromVector IShX sh
sh (Vector a -> Mixed sh (Primitive a))
-> ST s (Vector a) -> ST s (Mixed sh (Primitive a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MVector (PrimState (ST s)) a -> ST s (Vector a)
forall a (m :: * -> *).
(Storable a, PrimMonad m) =>
MVector (PrimState m) a -> m (Vector a)
VS.freeze MVector s a
MVector (PrimState (ST s)) a
v

-- [PRIMITIVE ELEMENT TYPES LIST]
deriving via Primitive Bool instance Elt Bool
deriving via Primitive Int instance Elt Int
deriving via Primitive Int64 instance Elt Int64
deriving via Primitive Int32 instance Elt Int32
deriving via Primitive CInt instance Elt CInt
deriving via Primitive Double instance Elt Double
deriving via Primitive Float instance Elt Float
deriving via Primitive () instance Elt ()

instance Storable a => KnownElt (Primitive a) where
  memptyArrayUnsafe :: forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh (Primitive a)
memptyArrayUnsafe IShX sh
sh = IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (IShX sh -> XArray sh a
forall (sh :: [Maybe Nat]) a. Storable a => IShX sh -> XArray sh a
X.empty IShX sh
sh)
  mvecsUnsafeNew :: forall (sh :: [Maybe Nat]) s.
IShX sh -> Primitive a -> ST s (MixedVecs s sh (Primitive a))
mvecsUnsafeNew IShX sh
sh Primitive a
_ = MVector s a -> MixedVecs s sh (Primitive a)
forall s (sh :: [Maybe Nat]) a.
MVector s a -> MixedVecs s sh (Primitive a)
MV_Primitive (MVector s a -> MixedVecs s sh (Primitive a))
-> ST s (MVector s a) -> ST s (MixedVecs s sh (Primitive a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ST s (MVector (PrimState (ST s)) a)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
Int -> m (MVector (PrimState m) a)
VSM.unsafeNew (IShX sh -> Int
forall (sh :: [Maybe Nat]). IShX sh -> Int
shxSize IShX sh
sh)
  mvecsNewEmpty :: forall s (sh :: [Maybe Nat]).
Proxy (Primitive a) -> ST s (MixedVecs s sh (Primitive a))
mvecsNewEmpty Proxy (Primitive a)
_ = MVector s a -> MixedVecs s sh (Primitive a)
forall s (sh :: [Maybe Nat]) a.
MVector s a -> MixedVecs s sh (Primitive a)
MV_Primitive (MVector s a -> MixedVecs s sh (Primitive a))
-> ST s (MVector s a) -> ST s (MixedVecs s sh (Primitive a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ST s (MVector (PrimState (ST s)) a)
forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
Int -> m (MVector (PrimState m) a)
VSM.unsafeNew Int
0

-- [PRIMITIVE ELEMENT TYPES LIST]
deriving via Primitive Bool instance KnownElt Bool
deriving via Primitive Int instance KnownElt Int
deriving via Primitive Int64 instance KnownElt Int64
deriving via Primitive Int32 instance KnownElt Int32
deriving via Primitive CInt instance KnownElt CInt
deriving via Primitive Double instance KnownElt Double
deriving via Primitive Float instance KnownElt Float
deriving via Primitive () instance KnownElt ()

-- Arrays of pairs are pairs of arrays.
instance (Elt a, Elt b) => Elt (a, b) where
  mshape :: forall (sh :: [Maybe Nat]). Mixed sh (a, b) -> IShX sh
mshape (M_Tup2 Mixed sh a
a Mixed sh b
_) = Mixed sh a -> IShX sh
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
a
  mindex :: forall (sh :: [Maybe Nat]). Mixed sh (a, b) -> IIxX sh -> (a, b)
mindex (M_Tup2 Mixed sh a
a Mixed sh b
b) IIxX sh
i = (Mixed sh a -> IIxX sh -> a
forall (sh :: [Maybe Nat]). Mixed sh a -> IIxX sh -> a
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IIxX sh -> a
mindex Mixed sh a
a IIxX sh
i, Mixed sh b -> IIxX sh -> b
forall (sh :: [Maybe Nat]). Mixed sh b -> IIxX sh -> b
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IIxX sh -> a
mindex Mixed sh b
b IIxX sh
i)
  mindexPartial :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Mixed (sh ++ sh') (a, b) -> IIxX sh -> Mixed sh' (a, b)
mindexPartial (M_Tup2 Mixed (sh ++ sh') a
a Mixed (sh ++ sh') b
b) IIxX sh
i = Mixed sh' a -> Mixed sh' b -> Mixed sh' (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Elt a =>
Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
mindexPartial Mixed (sh ++ sh') a
a IIxX sh
i) (Mixed (sh ++ sh') b -> IIxX sh -> Mixed sh' b
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Mixed (sh ++ sh') b -> IIxX sh -> Mixed sh' b
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Elt a =>
Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
mindexPartial Mixed (sh ++ sh') b
b IIxX sh
i)
  mscalar :: (a, b) -> Mixed '[] (a, b)
mscalar (a
x, b
y) = Mixed '[] a -> Mixed '[] b -> Mixed '[] (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (a -> Mixed '[] a
forall a. Elt a => a -> Mixed '[] a
mscalar a
x) (b -> Mixed '[] b
forall a. Elt a => a -> Mixed '[] a
mscalar b
y)
  mfromListOuter :: forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh (a, b)) -> Mixed ('Nothing : sh) (a, b)
mfromListOuter NonEmpty (Mixed sh (a, b))
l =
    Mixed ('Nothing : sh) a
-> Mixed ('Nothing : sh) b -> Mixed ('Nothing : sh) (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
mfromListOuter ((\(M_Tup2 Mixed sh a
x Mixed sh b
_) -> Mixed sh a
x) (Mixed sh (a, b) -> Mixed sh a)
-> NonEmpty (Mixed sh (a, b)) -> NonEmpty (Mixed sh a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty (Mixed sh (a, b))
l))
           (NonEmpty (Mixed sh b) -> Mixed ('Nothing : sh) b
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh b) -> Mixed ('Nothing : sh) b
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
mfromListOuter ((\(M_Tup2 Mixed sh a
_ Mixed sh b
y) -> Mixed sh b
y) (Mixed sh (a, b) -> Mixed sh b)
-> NonEmpty (Mixed sh (a, b)) -> NonEmpty (Mixed sh b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty (Mixed sh (a, b))
l))
  mtoListOuter :: forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) (a, b) -> [Mixed sh (a, b)]
mtoListOuter (M_Tup2 Mixed (n : sh) a
a Mixed (n : sh) b
b) = (Mixed sh a -> Mixed sh b -> Mixed sh (a, b))
-> [Mixed sh a] -> [Mixed sh b] -> [Mixed sh (a, b)]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (Mixed (n : sh) a -> [Mixed sh a]
forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) a -> [Mixed sh a]
forall a (n :: Maybe Nat) (sh :: [Maybe Nat]).
Elt a =>
Mixed (n : sh) a -> [Mixed sh a]
mtoListOuter Mixed (n : sh) a
a) (Mixed (n : sh) b -> [Mixed sh b]
forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) b -> [Mixed sh b]
forall a (n :: Maybe Nat) (sh :: [Maybe Nat]).
Elt a =>
Mixed (n : sh) a -> [Mixed sh a]
mtoListOuter Mixed (n : sh) b
b)
  mlift :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 (a, b)
-> Mixed sh2 (a, b)
mlift StaticShX sh2
ssh2 forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b
f (M_Tup2 Mixed sh1 a
a Mixed sh1 b
b) = Mixed sh2 a -> Mixed sh2 b -> Mixed sh2 (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift StaticShX sh2
ssh2 StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b
f Mixed sh1 a
a) (StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 b
-> Mixed sh2 b
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 b
-> Mixed sh2 b
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift StaticShX sh2
ssh2 StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b
f Mixed sh1 b
b)
  mlift2 :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 (a, b)
-> Mixed sh2 (a, b)
-> Mixed sh3 (a, b)
mlift2 StaticShX sh3
ssh3 forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray (sh1 ++ sh') b
-> XArray (sh2 ++ sh') b
-> XArray (sh3 ++ sh') b
f (M_Tup2 Mixed sh1 a
a Mixed sh1 b
b) (M_Tup2 Mixed sh2 a
x Mixed sh2 b
y) = Mixed sh3 a -> Mixed sh3 b -> Mixed sh3 (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
Elt a =>
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
mlift2 StaticShX sh3
ssh3 StaticShX sh'
-> XArray (sh1 ++ sh') b
-> XArray (sh2 ++ sh') b
-> XArray (sh3 ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray (sh1 ++ sh') b
-> XArray (sh2 ++ sh') b
-> XArray (sh3 ++ sh') b
f Mixed sh1 a
a Mixed sh2 a
x) (StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 b
-> Mixed sh2 b
-> Mixed sh3 b
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 b
-> Mixed sh2 b
-> Mixed sh3 b
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
Elt a =>
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
mlift2 StaticShX sh3
ssh3 StaticShX sh'
-> XArray (sh1 ++ sh') b
-> XArray (sh2 ++ sh') b
-> XArray (sh3 ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray (sh1 ++ sh') b
-> XArray (sh2 ++ sh') b
-> XArray (sh3 ++ sh') b
f Mixed sh1 b
b Mixed sh2 b
y)
  mliftL :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 (a, b))
-> NonEmpty (Mixed sh2 (a, b))
mliftL StaticShX sh2
ssh2 forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
f =
    let unzipT2l :: [Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
unzipT2l [] = ([], [])
        unzipT2l (M_Tup2 Mixed sh a
a Mixed sh b
b : [Mixed sh (a, b)]
l) = let ([Mixed sh a]
l1, [Mixed sh b]
l2) = [Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
unzipT2l [Mixed sh (a, b)]
l in (Mixed sh a
a Mixed sh a -> [Mixed sh a] -> [Mixed sh a]
forall a. a -> [a] -> [a]
: [Mixed sh a]
l1, Mixed sh b
b Mixed sh b -> [Mixed sh b] -> [Mixed sh b]
forall a. a -> [a] -> [a]
: [Mixed sh b]
l2)
        unzipT2 :: NonEmpty (Mixed sh (a, b))
-> (NonEmpty (Mixed sh a), NonEmpty (Mixed sh b))
unzipT2 (M_Tup2 Mixed sh a
a Mixed sh b
b :| [Mixed sh (a, b)]
l) = let ([Mixed sh a]
l1, [Mixed sh b]
l2) = [Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
forall {sh :: [Maybe Nat]} {a} {b}.
[Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
unzipT2l [Mixed sh (a, b)]
l in (Mixed sh a
a Mixed sh a -> [Mixed sh a] -> NonEmpty (Mixed sh a)
forall a. a -> [a] -> NonEmpty a
:| [Mixed sh a]
l1, Mixed sh b
b Mixed sh b -> [Mixed sh b] -> NonEmpty (Mixed sh b)
forall a. a -> [a] -> NonEmpty a
:| [Mixed sh b]
l2)
    in (NonEmpty (Mixed sh2 a)
 -> NonEmpty (Mixed sh2 b) -> NonEmpty (Mixed sh2 (a, b)))
-> (NonEmpty (Mixed sh2 a), NonEmpty (Mixed sh2 b))
-> NonEmpty (Mixed sh2 (a, b))
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((Mixed sh2 a -> Mixed sh2 b -> Mixed sh2 (a, b))
-> NonEmpty (Mixed sh2 a)
-> NonEmpty (Mixed sh2 b)
-> NonEmpty (Mixed sh2 (a, b))
forall a b c.
(a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c
NE.zipWith Mixed sh2 a -> Mixed sh2 b -> Mixed sh2 (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2) ((NonEmpty (Mixed sh2 a), NonEmpty (Mixed sh2 b))
 -> NonEmpty (Mixed sh2 (a, b)))
-> (NonEmpty (Mixed sh1 (a, b))
    -> (NonEmpty (Mixed sh2 a), NonEmpty (Mixed sh2 b)))
-> NonEmpty (Mixed sh1 (a, b))
-> NonEmpty (Mixed sh2 (a, b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NonEmpty (Mixed sh1 a) -> NonEmpty (Mixed sh2 a))
-> (NonEmpty (Mixed sh1 b) -> NonEmpty (Mixed sh2 b))
-> (NonEmpty (Mixed sh1 a), NonEmpty (Mixed sh1 b))
-> (NonEmpty (Mixed sh2 a), NonEmpty (Mixed sh2 b))
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap (StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 a)
-> NonEmpty (Mixed sh2 a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 a)
-> NonEmpty (Mixed sh2 a)
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 a)
-> NonEmpty (Mixed sh2 a)
mliftL StaticShX sh2
ssh2 StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
f) (StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 b)
-> NonEmpty (Mixed sh2 b)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 b)
-> NonEmpty (Mixed sh2 b)
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 a)
-> NonEmpty (Mixed sh2 a)
mliftL StaticShX sh2
ssh2 StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray (sh1 ++ sh') b)
-> NonEmpty (XArray (sh2 ++ sh') b)
f) ((NonEmpty (Mixed sh1 a), NonEmpty (Mixed sh1 b))
 -> (NonEmpty (Mixed sh2 a), NonEmpty (Mixed sh2 b)))
-> (NonEmpty (Mixed sh1 (a, b))
    -> (NonEmpty (Mixed sh1 a), NonEmpty (Mixed sh1 b)))
-> NonEmpty (Mixed sh1 (a, b))
-> (NonEmpty (Mixed sh2 a), NonEmpty (Mixed sh2 b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty (Mixed sh1 (a, b))
-> (NonEmpty (Mixed sh1 a), NonEmpty (Mixed sh1 b))
forall {sh :: [Maybe Nat]} {a} {b}.
NonEmpty (Mixed sh (a, b))
-> (NonEmpty (Mixed sh a), NonEmpty (Mixed sh b))
unzipT2

  mcastPartial :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') (a, b)
-> Mixed (sh2 ++ sh') (a, b)
mcastPartial StaticShX sh1
ssh1 StaticShX sh2
sh2 Proxy sh'
psh' (M_Tup2 Mixed (sh1 ++ sh') a
a Mixed (sh1 ++ sh') b
b) =
    Mixed (sh2 ++ sh') a
-> Mixed (sh2 ++ sh') b -> Mixed (sh2 ++ sh') (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Elt a, Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
mcastPartial StaticShX sh1
ssh1 StaticShX sh2
sh2 Proxy sh'
psh' Mixed (sh1 ++ sh') a
a) (StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') b
-> Mixed (sh2 ++ sh') b
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') b
-> Mixed (sh2 ++ sh') b
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Elt a, Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
mcastPartial StaticShX sh1
ssh1 StaticShX sh2
sh2 Proxy sh'
psh' Mixed (sh1 ++ sh') b
b)

  mtranspose :: forall (is :: [Nat]) (sh :: [Maybe Nat]).
(IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh (a, b) -> Mixed (PermutePrefix is sh) (a, b)
mtranspose Perm is
perm (M_Tup2 Mixed sh a
a Mixed sh b
b) = Mixed (Permute is (TakeLen is sh) ++ DropLen is sh) a
-> Mixed (Permute is (TakeLen is sh) ++ DropLen is sh) b
-> Mixed (Permute is (TakeLen is sh) ++ DropLen is sh) (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (Perm is
-> Mixed sh a
-> Mixed (Permute is (TakeLen is sh) ++ DropLen is sh) a
forall (is :: [Nat]) (sh :: [Maybe Nat]).
(IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh a -> Mixed (PermutePrefix is sh) a
forall a (is :: [Nat]) (sh :: [Maybe Nat]).
(Elt a, IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh a -> Mixed (PermutePrefix is sh) a
mtranspose Perm is
perm Mixed sh a
a) (Perm is
-> Mixed sh b
-> Mixed (Permute is (TakeLen is sh) ++ DropLen is sh) b
forall (is :: [Nat]) (sh :: [Maybe Nat]).
(IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh b -> Mixed (PermutePrefix is sh) b
forall a (is :: [Nat]) (sh :: [Maybe Nat]).
(Elt a, IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh a -> Mixed (PermutePrefix is sh) a
mtranspose Perm is
perm Mixed sh b
b)
  mconcat :: forall (sh :: [Maybe Nat]).
NonEmpty (Mixed ('Nothing : sh) (a, b))
-> Mixed ('Nothing : sh) (a, b)
mconcat =
    let unzipT2l :: [Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
unzipT2l [] = ([], [])
        unzipT2l (M_Tup2 Mixed sh a
a Mixed sh b
b : [Mixed sh (a, b)]
l) = let ([Mixed sh a]
l1, [Mixed sh b]
l2) = [Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
unzipT2l [Mixed sh (a, b)]
l in (Mixed sh a
a Mixed sh a -> [Mixed sh a] -> [Mixed sh a]
forall a. a -> [a] -> [a]
: [Mixed sh a]
l1, Mixed sh b
b Mixed sh b -> [Mixed sh b] -> [Mixed sh b]
forall a. a -> [a] -> [a]
: [Mixed sh b]
l2)
        unzipT2 :: NonEmpty (Mixed sh (a, b))
-> (NonEmpty (Mixed sh a), NonEmpty (Mixed sh b))
unzipT2 (M_Tup2 Mixed sh a
a Mixed sh b
b :| [Mixed sh (a, b)]
l) = let ([Mixed sh a]
l1, [Mixed sh b]
l2) = [Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
forall {sh :: [Maybe Nat]} {a} {b}.
[Mixed sh (a, b)] -> ([Mixed sh a], [Mixed sh b])
unzipT2l [Mixed sh (a, b)]
l in (Mixed sh a
a Mixed sh a -> [Mixed sh a] -> NonEmpty (Mixed sh a)
forall a. a -> [a] -> NonEmpty a
:| [Mixed sh a]
l1, Mixed sh b
b Mixed sh b -> [Mixed sh b] -> NonEmpty (Mixed sh b)
forall a. a -> [a] -> NonEmpty a
:| [Mixed sh b]
l2)
    in (Mixed ('Nothing : sh) a
 -> Mixed ('Nothing : sh) b -> Mixed ('Nothing : sh) (a, b))
-> (Mixed ('Nothing : sh) a, Mixed ('Nothing : sh) b)
-> Mixed ('Nothing : sh) (a, b)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Mixed ('Nothing : sh) a
-> Mixed ('Nothing : sh) b -> Mixed ('Nothing : sh) (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 ((Mixed ('Nothing : sh) a, Mixed ('Nothing : sh) b)
 -> Mixed ('Nothing : sh) (a, b))
-> (NonEmpty (Mixed ('Nothing : sh) (a, b))
    -> (Mixed ('Nothing : sh) a, Mixed ('Nothing : sh) b))
-> NonEmpty (Mixed ('Nothing : sh) (a, b))
-> Mixed ('Nothing : sh) (a, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a)
-> (NonEmpty (Mixed ('Nothing : sh) b) -> Mixed ('Nothing : sh) b)
-> (NonEmpty (Mixed ('Nothing : sh) a),
    NonEmpty (Mixed ('Nothing : sh) b))
-> (Mixed ('Nothing : sh) a, Mixed ('Nothing : sh) b)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a
mconcat NonEmpty (Mixed ('Nothing : sh) b) -> Mixed ('Nothing : sh) b
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed ('Nothing : sh) b) -> Mixed ('Nothing : sh) b
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a
mconcat ((NonEmpty (Mixed ('Nothing : sh) a),
  NonEmpty (Mixed ('Nothing : sh) b))
 -> (Mixed ('Nothing : sh) a, Mixed ('Nothing : sh) b))
-> (NonEmpty (Mixed ('Nothing : sh) (a, b))
    -> (NonEmpty (Mixed ('Nothing : sh) a),
        NonEmpty (Mixed ('Nothing : sh) b)))
-> NonEmpty (Mixed ('Nothing : sh) (a, b))
-> (Mixed ('Nothing : sh) a, Mixed ('Nothing : sh) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty (Mixed ('Nothing : sh) (a, b))
-> (NonEmpty (Mixed ('Nothing : sh) a),
    NonEmpty (Mixed ('Nothing : sh) b))
forall {sh :: [Maybe Nat]} {a} {b}.
NonEmpty (Mixed sh (a, b))
-> (NonEmpty (Mixed sh a), NonEmpty (Mixed sh b))
unzipT2

  mrnf :: forall (sh :: [Maybe Nat]). Mixed sh (a, b) -> ()
mrnf (M_Tup2 Mixed sh a
a Mixed sh b
b) = Mixed sh a -> ()
forall (sh :: [Maybe Nat]). Mixed sh a -> ()
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> ()
mrnf Mixed sh a
a () -> () -> ()
forall a b. a -> b -> b
`seq` Mixed sh b -> ()
forall (sh :: [Maybe Nat]). Mixed sh b -> ()
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> ()
mrnf Mixed sh b
b

  type ShapeTree (a, b) = (ShapeTree a, ShapeTree b)
  mshapeTree :: (a, b) -> ShapeTree (a, b)
mshapeTree (a
x, b
y) = (a -> ShapeTree a
forall a. Elt a => a -> ShapeTree a
mshapeTree a
x, b -> ShapeTree b
forall a. Elt a => a -> ShapeTree a
mshapeTree b
y)
  mshapeTreeEq :: Proxy (a, b) -> ShapeTree (a, b) -> ShapeTree (a, b) -> Bool
mshapeTreeEq Proxy (a, b)
_ (ShapeTree a
t1, ShapeTree b
t2) (ShapeTree a
t1', ShapeTree b
t2') = Proxy a -> ShapeTree a -> ShapeTree a -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> ShapeTree a -> Bool
mshapeTreeEq (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
t1 ShapeTree a
t1' Bool -> Bool -> Bool
&& Proxy b -> ShapeTree b -> ShapeTree b -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> ShapeTree a -> Bool
mshapeTreeEq (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b) ShapeTree b
t2 ShapeTree b
t2'
  mshapeTreeEmpty :: Proxy (a, b) -> ShapeTree (a, b) -> Bool
mshapeTreeEmpty Proxy (a, b)
_ (ShapeTree a
t1, ShapeTree b
t2) = Proxy a -> ShapeTree a -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> Bool
mshapeTreeEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
t1 Bool -> Bool -> Bool
&& Proxy b -> ShapeTree b -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> Bool
mshapeTreeEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b) ShapeTree b
t2
  mshowShapeTree :: Proxy (a, b) -> ShapeTree (a, b) -> String
mshowShapeTree Proxy (a, b)
_ (ShapeTree a
t1, ShapeTree b
t2) = String
"(" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Proxy a -> ShapeTree a -> String
forall a. Elt a => Proxy a -> ShapeTree a -> String
mshowShapeTree (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
t1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Proxy b -> ShapeTree b -> String
forall a. Elt a => Proxy a -> ShapeTree a -> String
mshowShapeTree (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b) ShapeTree b
t2 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
  marrayStrides :: forall (sh :: [Maybe Nat]). Mixed sh (a, b) -> Bag [Int]
marrayStrides (M_Tup2 Mixed sh a
a Mixed sh b
b) = Mixed sh a -> Bag [Int]
forall (sh :: [Maybe Nat]). Mixed sh a -> Bag [Int]
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> Bag [Int]
marrayStrides Mixed sh a
a Bag [Int] -> Bag [Int] -> Bag [Int]
forall a. Semigroup a => a -> a -> a
<> Mixed sh b -> Bag [Int]
forall (sh :: [Maybe Nat]). Mixed sh b -> Bag [Int]
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> Bag [Int]
marrayStrides Mixed sh b
b
  mvecsWrite :: forall (sh :: [Maybe Nat]) s.
IShX sh -> IIxX sh -> (a, b) -> MixedVecs s sh (a, b) -> ST s ()
mvecsWrite IShX sh
sh IIxX sh
i (a
x, b
y) (MV_Tup2 MixedVecs s sh a
a MixedVecs s sh b
b) = do
    IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
forall (sh :: [Maybe Nat]) s.
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
mvecsWrite IShX sh
sh IIxX sh
i a
x MixedVecs s sh a
a
    IShX sh -> IIxX sh -> b -> MixedVecs s sh b -> ST s ()
forall (sh :: [Maybe Nat]) s.
IShX sh -> IIxX sh -> b -> MixedVecs s sh b -> ST s ()
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
mvecsWrite IShX sh
sh IIxX sh
i b
y MixedVecs s sh b
b
  mvecsWritePartial :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh
-> Mixed sh' (a, b)
-> MixedVecs s (sh ++ sh') (a, b)
-> ST s ()
mvecsWritePartial IShX (sh ++ sh')
sh IIxX sh
i (M_Tup2 Mixed sh' a
x Mixed sh' b
y) (MV_Tup2 MixedVecs s (sh ++ sh') a
a MixedVecs s (sh ++ sh') b
b) = do
    IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
Elt a =>
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
mvecsWritePartial IShX (sh ++ sh')
sh IIxX sh
i Mixed sh' a
x MixedVecs s (sh ++ sh') a
a
    IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' b -> MixedVecs s (sh ++ sh') b -> ST s ()
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' b -> MixedVecs s (sh ++ sh') b -> ST s ()
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
Elt a =>
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
mvecsWritePartial IShX (sh ++ sh')
sh IIxX sh
i Mixed sh' b
y MixedVecs s (sh ++ sh') b
b
  mvecsFreeze :: forall (sh :: [Maybe Nat]) s.
IShX sh -> MixedVecs s sh (a, b) -> ST s (Mixed sh (a, b))
mvecsFreeze IShX sh
sh (MV_Tup2 MixedVecs s sh a
a MixedVecs s sh b
b) = Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (Mixed sh a -> Mixed sh b -> Mixed sh (a, b))
-> ST s (Mixed sh a) -> ST s (Mixed sh b -> Mixed sh (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
forall (sh :: [Maybe Nat]) s.
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
mvecsFreeze IShX sh
sh MixedVecs s sh a
a ST s (Mixed sh b -> Mixed sh (a, b))
-> ST s (Mixed sh b) -> ST s (Mixed sh (a, b))
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IShX sh -> MixedVecs s sh b -> ST s (Mixed sh b)
forall (sh :: [Maybe Nat]) s.
IShX sh -> MixedVecs s sh b -> ST s (Mixed sh b)
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
mvecsFreeze IShX sh
sh MixedVecs s sh b
b

instance (KnownElt a, KnownElt b) => KnownElt (a, b) where
  memptyArrayUnsafe :: forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh (a, b)
memptyArrayUnsafe IShX sh
sh = Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 (IShX sh -> Mixed sh a
forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh a
forall a (sh :: [Maybe Nat]). KnownElt a => IShX sh -> Mixed sh a
memptyArrayUnsafe IShX sh
sh) (IShX sh -> Mixed sh b
forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh b
forall a (sh :: [Maybe Nat]). KnownElt a => IShX sh -> Mixed sh a
memptyArrayUnsafe IShX sh
sh)
  mvecsUnsafeNew :: forall (sh :: [Maybe Nat]) s.
IShX sh -> (a, b) -> ST s (MixedVecs s sh (a, b))
mvecsUnsafeNew IShX sh
sh (a
x, b
y) = MixedVecs s sh a -> MixedVecs s sh b -> MixedVecs s sh (a, b)
forall s (sh :: [Maybe Nat]) a b.
MixedVecs s sh a -> MixedVecs s sh b -> MixedVecs s sh (a, b)
MV_Tup2 (MixedVecs s sh a -> MixedVecs s sh b -> MixedVecs s sh (a, b))
-> ST s (MixedVecs s sh a)
-> ST s (MixedVecs s sh b -> MixedVecs s sh (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IShX sh -> a -> ST s (MixedVecs s sh a)
forall (sh :: [Maybe Nat]) s.
IShX sh -> a -> ST s (MixedVecs s sh a)
forall a (sh :: [Maybe Nat]) s.
KnownElt a =>
IShX sh -> a -> ST s (MixedVecs s sh a)
mvecsUnsafeNew IShX sh
sh a
x ST s (MixedVecs s sh b -> MixedVecs s sh (a, b))
-> ST s (MixedVecs s sh b) -> ST s (MixedVecs s sh (a, b))
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IShX sh -> b -> ST s (MixedVecs s sh b)
forall (sh :: [Maybe Nat]) s.
IShX sh -> b -> ST s (MixedVecs s sh b)
forall a (sh :: [Maybe Nat]) s.
KnownElt a =>
IShX sh -> a -> ST s (MixedVecs s sh a)
mvecsUnsafeNew IShX sh
sh b
y
  mvecsNewEmpty :: forall s (sh :: [Maybe Nat]).
Proxy (a, b) -> ST s (MixedVecs s sh (a, b))
mvecsNewEmpty Proxy (a, b)
_ = MixedVecs s sh a -> MixedVecs s sh b -> MixedVecs s sh (a, b)
forall s (sh :: [Maybe Nat]) a b.
MixedVecs s sh a -> MixedVecs s sh b -> MixedVecs s sh (a, b)
MV_Tup2 (MixedVecs s sh a -> MixedVecs s sh b -> MixedVecs s sh (a, b))
-> ST s (MixedVecs s sh a)
-> ST s (MixedVecs s sh b -> MixedVecs s sh (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy a -> ST s (MixedVecs s sh a)
forall a s (sh :: [Maybe Nat]).
KnownElt a =>
Proxy a -> ST s (MixedVecs s sh a)
forall s (sh :: [Maybe Nat]). Proxy a -> ST s (MixedVecs s sh a)
mvecsNewEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ST s (MixedVecs s sh b -> MixedVecs s sh (a, b))
-> ST s (MixedVecs s sh b) -> ST s (MixedVecs s sh (a, b))
forall a b. ST s (a -> b) -> ST s a -> ST s b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Proxy b -> ST s (MixedVecs s sh b)
forall a s (sh :: [Maybe Nat]).
KnownElt a =>
Proxy a -> ST s (MixedVecs s sh a)
forall s (sh :: [Maybe Nat]). Proxy b -> ST s (MixedVecs s sh b)
mvecsNewEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @b)

-- Arrays of arrays are just arrays, but with more dimensions.
instance Elt a => Elt (Mixed sh' a) where
  -- TODO: this is quadratic in the nesting depth because it repeatedly
  -- truncates the shape vector to one a little shorter. Fix with a
  -- moverlongShape method, a prefix of which is mshape.
  mshape :: forall sh. Mixed sh (Mixed sh' a) -> IShX sh
  mshape :: forall (sh :: [Maybe Nat]). Mixed sh (Mixed sh' a) -> IShX sh
mshape (M_Nest IShX sh
sh Mixed (sh ++ sh') a
arr)
    = (IShX sh, ShX sh' Int) -> IShX sh
forall a b. (a, b) -> a
fst (Proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') Int -> (IShX sh, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) (Mixed (sh ++ sh') a -> ShX (sh ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh ++ sh') a
arr))

  mindex :: Mixed sh (Mixed sh' a) -> IIxX sh -> Mixed sh' a
  mindex :: forall (sh :: [Maybe Nat]).
Mixed sh (Mixed sh' a) -> IIxX sh -> Mixed sh' a
mindex (M_Nest IShX sh
_ Mixed (sh ++ sh') a
arr) = Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Elt a =>
Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
mindexPartial Mixed (sh ++ sh') a
arr

  mindexPartial :: forall sh1 sh2.
                   Mixed (sh1 ++ sh2) (Mixed sh' a) -> IIxX sh1 -> Mixed sh2 (Mixed sh' a)
  mindexPartial :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Mixed (sh ++ sh') (Mixed sh' a)
-> IIxX sh -> Mixed sh' (Mixed sh' a)
mindexPartial (M_Nest IShX (sh1 ++ sh2)
sh Mixed ((sh1 ++ sh2) ++ sh') a
arr) IIxX sh1
i
    | ((sh1 ++ sh2) ++ sh') :~: (sh1 ++ (sh2 ++ sh'))
Refl <- Proxy sh1
-> Proxy sh2
-> Proxy sh'
-> ((sh1 ++ sh2) ++ sh') :~: (sh1 ++ (sh2 ++ sh'))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh2) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    = IShX sh2 -> Mixed (sh2 ++ sh') a -> Mixed sh2 (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest (IIxX sh1 -> IShX (sh1 ++ sh2) -> IShX sh2
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i j.
IxX sh j -> ShX (sh ++ sh') i -> ShX sh' i
shxDropIx IIxX sh1
i IShX (sh1 ++ sh2)
sh) (forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Elt a =>
Mixed (sh ++ sh') a -> IIxX sh -> Mixed sh' a
mindexPartial @a @sh1 @(sh2 ++ sh') Mixed (sh1 ++ (sh2 ++ sh')) a
Mixed ((sh1 ++ sh2) ++ sh') a
arr IIxX sh1
i)

  mscalar :: Mixed sh' a -> Mixed '[] (Mixed sh' a)
mscalar = IShX '[] -> Mixed ('[] ++ sh') a -> Mixed '[] (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest IShX '[]
forall (sh :: [Maybe Nat]) i. (sh ~ '[]) => ShX sh i
ZSX

  mfromListOuter :: forall sh. NonEmpty (Mixed sh (Mixed sh' a)) -> Mixed (Nothing : sh) (Mixed sh' a)
  mfromListOuter :: forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh (Mixed sh' a))
-> Mixed ('Nothing : sh) (Mixed sh' a)
mfromListOuter l :: NonEmpty (Mixed sh (Mixed sh' a))
l@(Mixed sh (Mixed sh' a)
arr :| [Mixed sh (Mixed sh' a)]
_) =
    IShX ('Nothing : sh)
-> Mixed (('Nothing : sh) ++ sh') a
-> Mixed ('Nothing : sh) (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest (Int -> SMayNat Int SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown (NonEmpty (Mixed sh (Mixed sh' a)) -> Int
forall a. NonEmpty a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length NonEmpty (Mixed sh (Mixed sh' a))
l) SMayNat Int SNat 'Nothing -> ShX sh Int -> IShX ('Nothing : sh)
forall {sh1 :: [Maybe Nat]} {i} (n :: Maybe Nat)
       (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat i SNat n -> ShX sh i -> ShX sh1 i
:$% Mixed sh (Mixed sh' a) -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh (Mixed sh' a) -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh (Mixed sh' a)
arr)
           (NonEmpty (Mixed (sh ++ sh') a) -> Mixed ('Nothing : (sh ++ sh')) a
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
mfromListOuter ((\(M_Nest ShX sh Int
_ Mixed (sh ++ sh') a
a) -> Mixed (sh ++ sh') a
a) (Mixed sh (Mixed sh' a) -> Mixed (sh ++ sh') a)
-> NonEmpty (Mixed sh (Mixed sh' a))
-> NonEmpty (Mixed (sh ++ sh') a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty (Mixed sh (Mixed sh' a))
l))

  mtoListOuter :: forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) (Mixed sh' a) -> [Mixed sh (Mixed sh' a)]
mtoListOuter (M_Nest IShX (n : sh)
sh Mixed ((n : sh) ++ sh') a
arr) = (Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a))
-> [Mixed (sh ++ sh') a] -> [Mixed sh (Mixed sh' a)]
forall a b. (a -> b) -> [a] -> [b]
map (IShX sh -> Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest (IShX (n : sh) -> IShX sh
forall (n :: Maybe Nat) (sh :: [Maybe Nat]) i.
ShX (n : sh) i -> ShX sh i
shxTail IShX (n : sh)
sh)) (Mixed (n : (sh ++ sh')) a -> [Mixed (sh ++ sh') a]
forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) a -> [Mixed sh a]
forall a (n :: Maybe Nat) (sh :: [Maybe Nat]).
Elt a =>
Mixed (n : sh) a -> [Mixed sh a]
mtoListOuter Mixed (n : (sh ++ sh')) a
Mixed ((n : sh) ++ sh') a
arr)

  mlift :: forall sh1 sh2.
           StaticShX sh2
        -> (forall shT b. Storable b => StaticShX shT -> XArray (sh1 ++ shT) b -> XArray (sh2 ++ shT) b)
        -> Mixed sh1 (Mixed sh' a) -> Mixed sh2 (Mixed sh' a)
  mlift :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 (Mixed sh' a)
-> Mixed sh2 (Mixed sh' a)
mlift StaticShX sh2
ssh2 forall (shT :: [Maybe Nat]) b.
Storable b =>
StaticShX shT -> XArray (sh1 ++ shT) b -> XArray (sh2 ++ shT) b
f (M_Nest IShX sh1
sh1 Mixed (sh1 ++ sh') a
arr) =
    let result :: Mixed (sh2 ++ sh') a
result = StaticShX (sh2 ++ sh')
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray ((sh1 ++ sh') ++ sh') b
    -> XArray ((sh2 ++ sh') ++ sh') b)
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift (StaticShX sh2 -> StaticShX sh' -> StaticShX (sh2 ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh2
ssh2 StaticShX sh'
ssh') StaticShX sh'
-> XArray ((sh1 ++ sh') ++ sh') b -> XArray ((sh2 ++ sh') ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray ((sh1 ++ sh') ++ sh') b -> XArray ((sh2 ++ sh') ++ sh') b
f' Mixed (sh1 ++ sh') a
arr
        (ShX sh2 Int
sh2, ShX sh' Int
_) = Proxy sh'
-> StaticShX sh2
-> ShX (sh2 ++ sh') Int
-> (ShX sh2 Int, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') StaticShX sh2
ssh2 (Mixed (sh2 ++ sh') a -> ShX (sh2 ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh2 ++ sh') a
result)
    in ShX sh2 Int -> Mixed (sh2 ++ sh') a -> Mixed sh2 (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest ShX sh2 Int
sh2 Mixed (sh2 ++ sh') a
result
    where
      ssh' :: StaticShX sh'
ssh' = ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ((IShX sh1, ShX sh' Int) -> ShX sh' Int
forall a b. (a, b) -> b
snd (Proxy sh'
-> StaticShX sh1 -> ShX (sh1 ++ sh') Int -> (IShX sh1, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (IShX sh1 -> StaticShX sh1
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh1
sh1) (Mixed (sh1 ++ sh') a -> ShX (sh1 ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh1 ++ sh') a
arr)))

      f' :: forall shT b. Storable b => StaticShX shT -> XArray ((sh1 ++ sh') ++ shT) b -> XArray ((sh2 ++ sh') ++ shT) b
      f' :: forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray ((sh1 ++ sh') ++ sh') b -> XArray ((sh2 ++ sh') ++ sh') b
f' StaticShX shT
sshT
        | ((sh1 ++ sh') ++ shT) :~: (sh1 ++ (sh' ++ shT))
Refl <- Proxy sh1
-> Proxy sh'
-> Proxy shT
-> ((sh1 ++ sh') ++ shT) :~: (sh1 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        , ((sh2 ++ sh') ++ shT) :~: (sh2 ++ (sh' ++ shT))
Refl <- Proxy sh2
-> Proxy sh'
-> Proxy shT
-> ((sh2 ++ sh') ++ shT) :~: (sh2 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh2) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        = StaticShX (sh' ++ shT)
-> XArray (sh1 ++ (sh' ++ shT)) b -> XArray (sh2 ++ (sh' ++ shT)) b
forall (shT :: [Maybe Nat]) b.
Storable b =>
StaticShX shT -> XArray (sh1 ++ shT) b -> XArray (sh2 ++ shT) b
f (StaticShX sh' -> StaticShX shT -> StaticShX (sh' ++ shT)
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh'
ssh' StaticShX shT
sshT)

  mlift2 :: forall sh1 sh2 sh3.
            StaticShX sh3
         -> (forall shT b. Storable b => StaticShX shT -> XArray (sh1 ++ shT) b -> XArray (sh2 ++ shT) b -> XArray (sh3 ++ shT) b)
         -> Mixed sh1 (Mixed sh' a) -> Mixed sh2 (Mixed sh' a) -> Mixed sh3 (Mixed sh' a)
  mlift2 :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 (Mixed sh' a)
-> Mixed sh2 (Mixed sh' a)
-> Mixed sh3 (Mixed sh' a)
mlift2 StaticShX sh3
ssh3 forall (shT :: [Maybe Nat]) b.
Storable b =>
StaticShX shT
-> XArray (sh1 ++ shT) b
-> XArray (sh2 ++ shT) b
-> XArray (sh3 ++ shT) b
f (M_Nest IShX sh1
sh1 Mixed (sh1 ++ sh') a
arr1) (M_Nest IShX sh2
_ Mixed (sh2 ++ sh') a
arr2) =
    let result :: Mixed (sh3 ++ sh') a
result = StaticShX (sh3 ++ sh')
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray ((sh1 ++ sh') ++ sh') b
    -> XArray ((sh2 ++ sh') ++ sh') b
    -> XArray ((sh3 ++ sh') ++ sh') b)
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
-> Mixed (sh3 ++ sh') a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
Elt a =>
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
mlift2 (StaticShX sh3 -> StaticShX sh' -> StaticShX (sh3 ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh3
ssh3 StaticShX sh'
ssh') StaticShX sh'
-> XArray ((sh1 ++ sh') ++ sh') b
-> XArray ((sh2 ++ sh') ++ sh') b
-> XArray ((sh3 ++ sh') ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray ((sh1 ++ sh') ++ sh') b
-> XArray ((sh2 ++ sh') ++ sh') b
-> XArray ((sh3 ++ sh') ++ sh') b
f' Mixed (sh1 ++ sh') a
arr1 Mixed (sh2 ++ sh') a
arr2
        (ShX sh3 Int
sh3, ShX sh' Int
_) = Proxy sh'
-> StaticShX sh3
-> ShX (sh3 ++ sh') Int
-> (ShX sh3 Int, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') StaticShX sh3
ssh3 (Mixed (sh3 ++ sh') a -> ShX (sh3 ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh3 ++ sh') a
result)
    in ShX sh3 Int -> Mixed (sh3 ++ sh') a -> Mixed sh3 (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest ShX sh3 Int
sh3 Mixed (sh3 ++ sh') a
result
    where
      ssh' :: StaticShX sh'
ssh' = ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ((IShX sh1, ShX sh' Int) -> ShX sh' Int
forall a b. (a, b) -> b
snd (Proxy sh'
-> StaticShX sh1 -> ShX (sh1 ++ sh') Int -> (IShX sh1, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (IShX sh1 -> StaticShX sh1
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh1
sh1) (Mixed (sh1 ++ sh') a -> ShX (sh1 ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh1 ++ sh') a
arr1)))

      f' :: forall shT b. Storable b => StaticShX shT -> XArray ((sh1 ++ sh') ++ shT) b -> XArray ((sh2 ++ sh') ++ shT) b -> XArray ((sh3 ++ sh') ++ shT) b
      f' :: forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray ((sh1 ++ sh') ++ sh') b
-> XArray ((sh2 ++ sh') ++ sh') b
-> XArray ((sh3 ++ sh') ++ sh') b
f' StaticShX shT
sshT
        | ((sh1 ++ sh') ++ shT) :~: (sh1 ++ (sh' ++ shT))
Refl <- Proxy sh1
-> Proxy sh'
-> Proxy shT
-> ((sh1 ++ sh') ++ shT) :~: (sh1 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        , ((sh2 ++ sh') ++ shT) :~: (sh2 ++ (sh' ++ shT))
Refl <- Proxy sh2
-> Proxy sh'
-> Proxy shT
-> ((sh2 ++ sh') ++ shT) :~: (sh2 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh2) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        , ((sh3 ++ sh') ++ shT) :~: (sh3 ++ (sh' ++ shT))
Refl <- Proxy sh3
-> Proxy sh'
-> Proxy shT
-> ((sh3 ++ sh') ++ shT) :~: (sh3 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh3) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        = StaticShX (sh' ++ shT)
-> XArray (sh1 ++ (sh' ++ shT)) b
-> XArray (sh2 ++ (sh' ++ shT)) b
-> XArray (sh3 ++ (sh' ++ shT)) b
forall (shT :: [Maybe Nat]) b.
Storable b =>
StaticShX shT
-> XArray (sh1 ++ shT) b
-> XArray (sh2 ++ shT) b
-> XArray (sh3 ++ shT) b
f (StaticShX sh' -> StaticShX shT -> StaticShX (sh' ++ shT)
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh'
ssh' StaticShX shT
sshT)

  mliftL :: forall sh1 sh2.
            StaticShX sh2
         -> (forall shT b. Storable b => StaticShX shT -> NonEmpty (XArray (sh1 ++ shT) b) -> NonEmpty (XArray (sh2 ++ shT) b))
         -> NonEmpty (Mixed sh1 (Mixed sh' a)) -> NonEmpty (Mixed sh2 (Mixed sh' a))
  mliftL :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 (Mixed sh' a))
-> NonEmpty (Mixed sh2 (Mixed sh' a))
mliftL StaticShX sh2
ssh2 forall (shT :: [Maybe Nat]) b.
Storable b =>
StaticShX shT
-> NonEmpty (XArray (sh1 ++ shT) b)
-> NonEmpty (XArray (sh2 ++ shT) b)
f l :: NonEmpty (Mixed sh1 (Mixed sh' a))
l@(M_Nest IShX sh1
sh1 Mixed (sh1 ++ sh') a
arr1 :| [Mixed sh1 (Mixed sh' a)]
_) =
    let result :: NonEmpty (Mixed (sh2 ++ sh') a)
result = StaticShX (sh2 ++ sh')
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray ((sh1 ++ sh') ++ sh') b)
    -> NonEmpty (XArray ((sh2 ++ sh') ++ sh') b))
-> NonEmpty (Mixed (sh1 ++ sh') a)
-> NonEmpty (Mixed (sh2 ++ sh') a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 a)
-> NonEmpty (Mixed sh2 a)
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> NonEmpty (XArray (sh1 ++ sh') b)
    -> NonEmpty (XArray (sh2 ++ sh') b))
-> NonEmpty (Mixed sh1 a)
-> NonEmpty (Mixed sh2 a)
mliftL (StaticShX sh2 -> StaticShX sh' -> StaticShX (sh2 ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh2
ssh2 StaticShX sh'
ssh') StaticShX sh'
-> NonEmpty (XArray ((sh1 ++ sh') ++ sh') b)
-> NonEmpty (XArray ((sh2 ++ sh') ++ sh') b)
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray ((sh1 ++ sh') ++ sh') b)
-> NonEmpty (XArray ((sh2 ++ sh') ++ sh') b)
f' ((Mixed sh1 (Mixed sh' a) -> Mixed (sh1 ++ sh') a)
-> NonEmpty (Mixed sh1 (Mixed sh' a))
-> NonEmpty (Mixed (sh1 ++ sh') a)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(M_Nest IShX sh1
_ Mixed (sh1 ++ sh') a
arr) -> Mixed (sh1 ++ sh') a
arr) NonEmpty (Mixed sh1 (Mixed sh' a))
l)
        (ShX sh2 Int
sh2, ShX sh' Int
_) = Proxy sh'
-> StaticShX sh2
-> ShX (sh2 ++ sh') Int
-> (ShX sh2 Int, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') StaticShX sh2
ssh2 (Mixed (sh2 ++ sh') a -> ShX (sh2 ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape (NonEmpty (Mixed (sh2 ++ sh') a) -> Mixed (sh2 ++ sh') a
forall a. NonEmpty a -> a
NE.head NonEmpty (Mixed (sh2 ++ sh') a)
result))
    in (Mixed (sh2 ++ sh') a -> Mixed sh2 (Mixed sh' a))
-> NonEmpty (Mixed (sh2 ++ sh') a)
-> NonEmpty (Mixed sh2 (Mixed sh' a))
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ShX sh2 Int -> Mixed (sh2 ++ sh') a -> Mixed sh2 (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest ShX sh2 Int
sh2) NonEmpty (Mixed (sh2 ++ sh') a)
result
    where
      ssh' :: StaticShX sh'
ssh' = ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ((IShX sh1, ShX sh' Int) -> ShX sh' Int
forall a b. (a, b) -> b
snd (Proxy sh'
-> StaticShX sh1 -> ShX (sh1 ++ sh') Int -> (IShX sh1, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (IShX sh1 -> StaticShX sh1
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh1
sh1) (Mixed (sh1 ++ sh') a -> ShX (sh1 ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh1 ++ sh') a
arr1)))

      f' :: forall shT b. Storable b => StaticShX shT -> NonEmpty (XArray ((sh1 ++ sh') ++ shT) b) -> NonEmpty (XArray ((sh2 ++ sh') ++ shT) b)
      f' :: forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> NonEmpty (XArray ((sh1 ++ sh') ++ sh') b)
-> NonEmpty (XArray ((sh2 ++ sh') ++ sh') b)
f' StaticShX shT
sshT
        | ((sh1 ++ sh') ++ shT) :~: (sh1 ++ (sh' ++ shT))
Refl <- Proxy sh1
-> Proxy sh'
-> Proxy shT
-> ((sh1 ++ sh') ++ shT) :~: (sh1 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        , ((sh2 ++ sh') ++ shT) :~: (sh2 ++ (sh' ++ shT))
Refl <- Proxy sh2
-> Proxy sh'
-> Proxy shT
-> ((sh2 ++ sh') ++ shT) :~: (sh2 ++ (sh' ++ shT))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh2) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT)
        = StaticShX (sh' ++ shT)
-> NonEmpty (XArray (sh1 ++ (sh' ++ shT)) b)
-> NonEmpty (XArray (sh2 ++ (sh' ++ shT)) b)
forall (shT :: [Maybe Nat]) b.
Storable b =>
StaticShX shT
-> NonEmpty (XArray (sh1 ++ shT) b)
-> NonEmpty (XArray (sh2 ++ shT) b)
f (StaticShX sh' -> StaticShX shT -> StaticShX (sh' ++ shT)
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh'
ssh' StaticShX shT
sshT)

  mcastPartial :: forall sh1 sh2 shT. Rank sh1 ~ Rank sh2
               => StaticShX sh1 -> StaticShX sh2 -> Proxy shT -> Mixed (sh1 ++ shT) (Mixed sh' a) -> Mixed (sh2 ++ shT) (Mixed sh' a)
  mcastPartial :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') (Mixed sh' a)
-> Mixed (sh2 ++ sh') (Mixed sh' a)
mcastPartial StaticShX sh1
ssh1 StaticShX sh2
ssh2 Proxy shT
_ (M_Nest IShX (sh1 ++ shT)
sh1T Mixed ((sh1 ++ shT) ++ sh') a
arr)
    | ((sh1 ++ shT) ++ sh') :~: (sh1 ++ (shT ++ sh'))
Refl <- Proxy sh1
-> Proxy shT
-> Proxy sh'
-> ((sh1 ++ shT) ++ sh') :~: (sh1 ++ (shT ++ sh'))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    , ((sh2 ++ shT) ++ sh') :~: (sh2 ++ (shT ++ sh'))
Refl <- Proxy sh2
-> Proxy shT
-> Proxy sh'
-> ((sh2 ++ shT) ++ sh') :~: (sh2 ++ (shT ++ sh'))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh2) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    = let (ShX sh1 Int
sh1, ShX shT Int
shT) = Proxy shT
-> StaticShX sh1 -> IShX (sh1 ++ shT) -> (ShX sh1 Int, ShX shT Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT) StaticShX sh1
ssh1 IShX (sh1 ++ shT)
sh1T
          sh2 :: IShX sh2
sh2 = StaticShX sh2 -> ShX sh1 Int -> IShX sh2
forall (sh' :: [Maybe Nat]) (sh :: [Maybe Nat]).
StaticShX sh' -> IShX sh -> IShX sh'
shxCast' StaticShX sh2
ssh2 ShX sh1 Int
sh1
      in IShX (sh2 ++ shT)
-> Mixed ((sh2 ++ shT) ++ sh') a
-> Mixed (sh2 ++ shT) (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest (IShX sh2 -> ShX shT Int -> IShX (sh2 ++ shT)
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX sh2
sh2 ShX shT Int
shT) (StaticShX sh1
-> StaticShX sh2
-> Proxy (shT ++ sh')
-> Mixed (sh1 ++ (shT ++ sh')) a
-> Mixed (sh2 ++ (shT ++ sh')) a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]).
(Elt a, Rank sh1 ~ Rank sh2) =>
StaticShX sh1
-> StaticShX sh2
-> Proxy sh'
-> Mixed (sh1 ++ sh') a
-> Mixed (sh2 ++ sh') a
mcastPartial StaticShX sh1
ssh1 StaticShX sh2
ssh2 (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @(shT ++ sh')) Mixed (sh1 ++ (shT ++ sh')) a
Mixed ((sh1 ++ shT) ++ sh') a
arr)

  mtranspose :: forall is sh. (IsPermutation is, Rank is <= Rank sh)
             => Perm is -> Mixed sh (Mixed sh' a)
             -> Mixed (PermutePrefix is sh) (Mixed sh' a)
  mtranspose :: forall (is :: [Nat]) (sh :: [Maybe Nat]).
(IsPermutation is, Rank is <= Rank sh) =>
Perm is
-> Mixed sh (Mixed sh' a)
-> Mixed (PermutePrefix is sh) (Mixed sh' a)
mtranspose Perm is
perm (M_Nest IShX sh
sh Mixed (sh ++ sh') a
arr)
    | let sh' :: ShX sh' Int
sh' = forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX (sh ++ sh') i -> ShX sh' i
shxDropSh @sh @sh' IShX sh
sh (Mixed (sh ++ sh') a -> ShX (sh ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh ++ sh') a
arr)
    , Rank (sh ++ sh') :~: (Rank sh + Rank sh')
Refl <- StaticShX sh
-> StaticShX sh' -> Rank (sh ++ sh') :~: (Rank sh + Rank sh')
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh1
-> StaticShX sh2 -> Rank (sh1 ++ sh2) :~: (Rank sh1 + Rank sh2)
lemRankApp (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) (ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh' Int
sh')
    , (Rank is <=? (Rank sh + Rank sh')) :~: 'True
Refl <- Proxy (Rank is)
-> Proxy (Rank sh)
-> Proxy (Rank sh')
-> (Rank is <=? (Rank sh + Rank sh')) :~: 'True
forall (n :: Nat) (m :: Nat) (k :: Nat).
(n <= m) =>
Proxy n -> Proxy m -> Proxy k -> (n <=? (m + k)) :~: 'True
lemLeqPlus (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Rank is)) (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Rank sh)) (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Rank sh'))
    , ((Permute is (TakeLen is (sh ++ sh')) ++ DropLen is sh) ++ sh')
:~: (Permute is (TakeLen is (sh ++ sh')) ++ (DropLen is sh ++ sh'))
Refl <- Proxy (Permute is (TakeLen is (sh ++ sh')))
-> Proxy (DropLen is sh)
-> Proxy sh'
-> ((Permute is (TakeLen is (sh ++ sh')) ++ DropLen is sh) ++ sh')
   :~: (Permute is (TakeLen is (sh ++ sh')) ++ (DropLen is sh ++ sh'))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Permute is (TakeLen is (sh ++ sh')))) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @(DropLen is sh)) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    , (DropLen is sh ++ sh') :~: DropLen is (sh ++ sh')
Refl <- Proxy is
-> Proxy sh
-> Proxy sh'
-> (DropLen is sh ++ sh') :~: DropLen is (sh ++ sh')
forall {a1} {a} (l1 :: [a1]) (l2 :: [a]) (rest :: [a]).
(Rank l1 <= Rank l2) =>
Proxy l1
-> Proxy l2
-> Proxy rest
-> (DropLen l1 l2 ++ rest) :~: DropLen l1 (l2 ++ rest)
lemDropLenApp (forall (t :: [Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @is) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    , TakeLen is sh :~: TakeLen is (sh ++ sh')
Refl <- Proxy is
-> Proxy sh
-> Proxy sh'
-> TakeLen is sh :~: TakeLen is (sh ++ sh')
forall {a1} {a} (l1 :: [a1]) (l2 :: [a]) (rest :: [a]).
(Rank l1 <= Rank l2) =>
Proxy l1
-> Proxy l2
-> Proxy rest
-> TakeLen l1 l2 :~: TakeLen l1 (l2 ++ rest)
lemTakeLenApp (forall (t :: [Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @is) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    = IShX (Permute is (TakeLen is sh) ++ DropLen is sh)
-> Mixed ((Permute is (TakeLen is sh) ++ DropLen is sh) ++ sh') a
-> Mixed
     (Permute is (TakeLen is sh) ++ DropLen is sh) (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest (Perm is
-> IShX sh -> IShX (Permute is (TakeLen is sh) ++ DropLen is sh)
forall (is :: [Nat]) (sh :: [Maybe Nat]).
Perm is -> IShX sh -> IShX (PermutePrefix is sh)
shxPermutePrefix Perm is
perm IShX sh
sh)
             (Perm is
-> Mixed (sh ++ sh') a -> Mixed (PermutePrefix is (sh ++ sh')) a
forall (is :: [Nat]) (sh :: [Maybe Nat]).
(IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh a -> Mixed (PermutePrefix is sh) a
forall a (is :: [Nat]) (sh :: [Maybe Nat]).
(Elt a, IsPermutation is, Rank is <= Rank sh) =>
Perm is -> Mixed sh a -> Mixed (PermutePrefix is sh) a
mtranspose Perm is
perm Mixed (sh ++ sh') a
arr)

  mconcat :: NonEmpty (Mixed (Nothing : sh) (Mixed sh' a)) -> Mixed (Nothing : sh) (Mixed sh' a)
  mconcat :: forall (sh :: [Maybe Nat]).
NonEmpty (Mixed ('Nothing : sh) (Mixed sh' a))
-> Mixed ('Nothing : sh) (Mixed sh' a)
mconcat l :: NonEmpty (Mixed ('Nothing : sh) (Mixed sh' a))
l@(M_Nest IShX ('Nothing : sh)
sh1 Mixed (('Nothing : sh) ++ sh') a
_ :| [Mixed ('Nothing : sh) (Mixed sh' a)]
_) =
    let result :: Mixed ('Nothing : (sh ++ sh')) a
result = NonEmpty (Mixed ('Nothing : (sh ++ sh')) a)
-> Mixed ('Nothing : (sh ++ sh')) a
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed ('Nothing : sh) a) -> Mixed ('Nothing : sh) a
mconcat ((Mixed ('Nothing : sh) (Mixed sh' a)
 -> Mixed ('Nothing : (sh ++ sh')) a)
-> NonEmpty (Mixed ('Nothing : sh) (Mixed sh' a))
-> NonEmpty (Mixed ('Nothing : (sh ++ sh')) a)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(M_Nest IShX ('Nothing : sh)
_ Mixed (('Nothing : sh) ++ sh') a
arr) -> Mixed ('Nothing : (sh ++ sh')) a
Mixed (('Nothing : sh) ++ sh') a
arr) NonEmpty (Mixed ('Nothing : sh) (Mixed sh' a))
l)
    in IShX ('Nothing : sh)
-> Mixed (('Nothing : sh) ++ sh') a
-> Mixed ('Nothing : sh) (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest ((IShX ('Nothing : sh), ShX sh' Int) -> IShX ('Nothing : sh)
forall a b. (a, b) -> a
fst (Proxy sh'
-> StaticShX ('Nothing : sh)
-> ShX (('Nothing : sh) ++ sh') Int
-> (IShX ('Nothing : sh), ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (IShX ('Nothing : sh) -> StaticShX ('Nothing : sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX ('Nothing : sh)
sh1) (Mixed ('Nothing : (sh ++ sh')) a -> IShX ('Nothing : (sh ++ sh'))
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed ('Nothing : (sh ++ sh')) a
result))) Mixed ('Nothing : (sh ++ sh')) a
Mixed (('Nothing : sh) ++ sh') a
result

  mrnf :: forall (sh :: [Maybe Nat]). Mixed sh (Mixed sh' a) -> ()
mrnf (M_Nest IShX sh
sh Mixed (sh ++ sh') a
arr) = IShX sh -> ()
forall a. NFData a => a -> ()
rnf IShX sh
sh () -> () -> ()
forall a b. a -> b -> b
`seq` Mixed (sh ++ sh') a -> ()
forall (sh :: [Maybe Nat]). Mixed sh a -> ()
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> ()
mrnf Mixed (sh ++ sh') a
arr

  type ShapeTree (Mixed sh' a) = (IShX sh', ShapeTree a)

  mshapeTree :: Mixed sh' a -> ShapeTree (Mixed sh' a)
  mshapeTree :: Mixed sh' a -> ShapeTree (Mixed sh' a)
mshapeTree Mixed sh' a
arr = (Mixed sh' a -> ShX sh' Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh' a
arr, a -> ShapeTree a
forall a. Elt a => a -> ShapeTree a
mshapeTree (Mixed sh' a -> IIxX sh' -> a
forall (sh :: [Maybe Nat]). Mixed sh a -> IIxX sh -> a
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IIxX sh -> a
mindex Mixed sh' a
arr (StaticShX sh' -> IIxX sh'
forall (sh :: [Maybe Nat]). StaticShX sh -> IIxX sh
ixxZero (ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX (Mixed sh' a -> ShX sh' Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh' a
arr)))))

  mshapeTreeEq :: Proxy (Mixed sh' a)
-> ShapeTree (Mixed sh' a) -> ShapeTree (Mixed sh' a) -> Bool
mshapeTreeEq Proxy (Mixed sh' a)
_ (ShX sh' Int
sh1, ShapeTree a
t1) (ShX sh' Int
sh2, ShapeTree a
t2) = ShX sh' Int
sh1 ShX sh' Int -> ShX sh' Int -> Bool
forall a. Eq a => a -> a -> Bool
== ShX sh' Int
sh2 Bool -> Bool -> Bool
&& Proxy a -> ShapeTree a -> ShapeTree a -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> ShapeTree a -> Bool
mshapeTreeEq (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
t1 ShapeTree a
t2

  mshapeTreeEmpty :: Proxy (Mixed sh' a) -> ShapeTree (Mixed sh' a) -> Bool
mshapeTreeEmpty Proxy (Mixed sh' a)
_ (ShX sh' Int
sh, ShapeTree a
t) = ShX sh' Int -> Int
forall (sh :: [Maybe Nat]). IShX sh -> Int
shxSize ShX sh' Int
sh Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&& Proxy a -> ShapeTree a -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> Bool
mshapeTreeEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
t

  mshowShapeTree :: Proxy (Mixed sh' a) -> ShapeTree (Mixed sh' a) -> String
mshowShapeTree Proxy (Mixed sh' a)
_ (ShX sh' Int
sh, ShapeTree a
t) = String
"(" String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShX sh' Int -> String
forall a. Show a => a -> String
show ShX sh' Int
sh String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Proxy a -> ShapeTree a -> String
forall a. Elt a => Proxy a -> ShapeTree a -> String
mshowShapeTree (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
t String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"

  marrayStrides :: forall (sh :: [Maybe Nat]). Mixed sh (Mixed sh' a) -> Bag [Int]
marrayStrides (M_Nest IShX sh
_ Mixed (sh ++ sh') a
arr) = Mixed (sh ++ sh') a -> Bag [Int]
forall (sh :: [Maybe Nat]). Mixed sh a -> Bag [Int]
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> Bag [Int]
marrayStrides Mixed (sh ++ sh') a
arr

  mvecsWrite :: forall (sh :: [Maybe Nat]) s.
IShX sh
-> IIxX sh
-> Mixed sh' a
-> MixedVecs s sh (Mixed sh' a)
-> ST s ()
mvecsWrite IShX sh
sh IIxX sh
idx Mixed sh' a
val (MV_Nest ShX sh' Int
sh' MixedVecs s (sh ++ sh') a
vecs) = IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
Elt a =>
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
mvecsWritePartial (IShX sh -> ShX sh' Int -> IShX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX sh
sh ShX sh' Int
sh') IIxX sh
idx Mixed sh' a
val MixedVecs s (sh ++ sh') a
vecs

  mvecsWritePartial :: forall sh1 sh2 s.
                       IShX (sh1 ++ sh2) -> IIxX sh1 -> Mixed sh2 (Mixed sh' a)
                    -> MixedVecs s (sh1 ++ sh2) (Mixed sh' a)
                    -> ST s ()
  mvecsWritePartial :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh
-> Mixed sh' (Mixed sh' a)
-> MixedVecs s (sh ++ sh') (Mixed sh' a)
-> ST s ()
mvecsWritePartial IShX (sh1 ++ sh2)
sh12 IIxX sh1
idx (M_Nest IShX sh2
_ Mixed (sh2 ++ sh') a
arr) (MV_Nest ShX sh' Int
sh' MixedVecs s ((sh1 ++ sh2) ++ sh') a
vecs)
    | ((sh1 ++ sh2) ++ sh') :~: (sh1 ++ (sh2 ++ sh'))
Refl <- Proxy sh1
-> Proxy sh2
-> Proxy sh'
-> ((sh1 ++ sh2) ++ sh') :~: (sh1 ++ (sh2 ++ sh'))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh2) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh')
    = IShX (sh1 ++ (sh2 ++ sh'))
-> IIxX sh1
-> Mixed (sh2 ++ sh') a
-> MixedVecs s (sh1 ++ (sh2 ++ sh')) a
-> ST s ()
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
forall a (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) s.
Elt a =>
IShX (sh ++ sh')
-> IIxX sh -> Mixed sh' a -> MixedVecs s (sh ++ sh') a -> ST s ()
mvecsWritePartial (IShX (sh1 ++ sh2) -> ShX sh' Int -> ShX ((sh1 ++ sh2) ++ sh') Int
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX (sh1 ++ sh2)
sh12 ShX sh' Int
sh') IIxX sh1
idx Mixed (sh2 ++ sh') a
arr MixedVecs s (sh1 ++ (sh2 ++ sh')) a
MixedVecs s ((sh1 ++ sh2) ++ sh') a
vecs

  mvecsFreeze :: forall (sh :: [Maybe Nat]) s.
IShX sh
-> MixedVecs s sh (Mixed sh' a) -> ST s (Mixed sh (Mixed sh' a))
mvecsFreeze IShX sh
sh (MV_Nest ShX sh' Int
sh' MixedVecs s (sh ++ sh') a
vecs) = IShX sh -> Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest IShX sh
sh (Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a))
-> ST s (Mixed (sh ++ sh') a) -> ST s (Mixed sh (Mixed sh' a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IShX (sh ++ sh')
-> MixedVecs s (sh ++ sh') a -> ST s (Mixed (sh ++ sh') a)
forall (sh :: [Maybe Nat]) s.
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
mvecsFreeze (IShX sh -> ShX sh' Int -> IShX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX sh
sh ShX sh' Int
sh') MixedVecs s (sh ++ sh') a
vecs

instance (KnownShX sh', KnownElt a) => KnownElt (Mixed sh' a) where
  memptyArrayUnsafe :: forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh (Mixed sh' a)
memptyArrayUnsafe IShX sh
sh = IShX sh -> Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest IShX sh
sh (IShX (sh ++ sh') -> Mixed (sh ++ sh') a
forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh a
forall a (sh :: [Maybe Nat]). KnownElt a => IShX sh -> Mixed sh a
memptyArrayUnsafe (IShX sh -> ShX sh' Int -> IShX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX sh
sh (StaticShX sh' -> ShX sh' Int
forall (sh :: [Maybe Nat]). StaticShX sh -> IShX sh
shxCompleteZeros (forall (sh :: [Maybe Nat]). KnownShX sh => StaticShX sh
knownShX @sh'))))

  mvecsUnsafeNew :: forall (sh :: [Maybe Nat]) s.
IShX sh -> Mixed sh' a -> ST s (MixedVecs s sh (Mixed sh' a))
mvecsUnsafeNew IShX sh
sh Mixed sh' a
example
    | ShX sh' Int -> Int
forall (sh :: [Maybe Nat]). IShX sh -> Int
shxSize ShX sh' Int
sh' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Proxy (Mixed sh' a) -> ST s (MixedVecs s sh (Mixed sh' a))
forall a s (sh :: [Maybe Nat]).
KnownElt a =>
Proxy a -> ST s (MixedVecs s sh a)
forall s (sh :: [Maybe Nat]).
Proxy (Mixed sh' a) -> ST s (MixedVecs s sh (Mixed sh' a))
mvecsNewEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Mixed sh' a))
    | Bool
otherwise = ShX sh' Int
-> MixedVecs s (sh ++ sh') a -> MixedVecs s sh (Mixed sh' a)
forall s (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh2
-> MixedVecs s (sh1 ++ sh2) a -> MixedVecs s sh1 (Mixed sh2 a)
MV_Nest ShX sh' Int
sh' (MixedVecs s (sh ++ sh') a -> MixedVecs s sh (Mixed sh' a))
-> ST s (MixedVecs s (sh ++ sh') a)
-> ST s (MixedVecs s sh (Mixed sh' a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IShX (sh ++ sh') -> a -> ST s (MixedVecs s (sh ++ sh') a)
forall (sh :: [Maybe Nat]) s.
IShX sh -> a -> ST s (MixedVecs s sh a)
forall a (sh :: [Maybe Nat]) s.
KnownElt a =>
IShX sh -> a -> ST s (MixedVecs s sh a)
mvecsUnsafeNew (IShX sh -> ShX sh' Int -> IShX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend IShX sh
sh ShX sh' Int
sh') (Mixed sh' a -> IIxX sh' -> a
forall (sh :: [Maybe Nat]). Mixed sh a -> IIxX sh -> a
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IIxX sh -> a
mindex Mixed sh' a
example (StaticShX sh' -> IIxX sh'
forall (sh :: [Maybe Nat]). StaticShX sh -> IIxX sh
ixxZero (ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh' Int
sh')))
    where
      sh' :: ShX sh' Int
sh' = Mixed sh' a -> ShX sh' Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh' a
example

  mvecsNewEmpty :: forall s (sh :: [Maybe Nat]).
Proxy (Mixed sh' a) -> ST s (MixedVecs s sh (Mixed sh' a))
mvecsNewEmpty Proxy (Mixed sh' a)
_ = ShX sh' Int
-> MixedVecs s (sh ++ sh') a -> MixedVecs s sh (Mixed sh' a)
forall s (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh2
-> MixedVecs s (sh1 ++ sh2) a -> MixedVecs s sh1 (Mixed sh2 a)
MV_Nest (StaticShX sh' -> ShX sh' Int
forall (sh :: [Maybe Nat]). StaticShX sh -> IShX sh
shxCompleteZeros (forall (sh :: [Maybe Nat]). KnownShX sh => StaticShX sh
knownShX @sh')) (MixedVecs s (sh ++ sh') a -> MixedVecs s sh (Mixed sh' a))
-> ST s (MixedVecs s (sh ++ sh') a)
-> ST s (MixedVecs s sh (Mixed sh' a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy a -> ST s (MixedVecs s (sh ++ sh') a)
forall a s (sh :: [Maybe Nat]).
KnownElt a =>
Proxy a -> ST s (MixedVecs s sh a)
forall s (sh :: [Maybe Nat]). Proxy a -> ST s (MixedVecs s sh a)
mvecsNewEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a)


memptyArray :: KnownElt a => IShX sh -> Mixed (Just 0 : sh) a
memptyArray :: forall a (sh :: [Maybe Nat]).
KnownElt a =>
IShX sh -> Mixed ('Just 0 : sh) a
memptyArray IShX sh
sh = IShX ('Just 0 : sh) -> Mixed ('Just 0 : sh) a
forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh a
forall a (sh :: [Maybe Nat]). KnownElt a => IShX sh -> Mixed sh a
memptyArrayUnsafe (SNat 0 -> SMayNat Int SNat ('Just 0)
forall {k} (f :: k -> *) (n1 :: k) i.
f n1 -> SMayNat i f ('Just n1)
SKnown SNat 0
forall (n :: Nat). KnownNat n => SNat n
SNat SMayNat Int SNat ('Just 0) -> IShX sh -> IShX ('Just 0 : sh)
forall {sh1 :: [Maybe Nat]} {i} (n :: Maybe Nat)
       (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat i SNat n -> ShX sh i -> ShX sh1 i
:$% IShX sh
sh)

mrank :: Elt a => Mixed sh a -> SNat (Rank sh)
mrank :: forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> SNat (Rank sh)
mrank = ShX sh Int -> SNat (Rank sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> SNat (Rank sh)
shxRank (ShX sh Int -> SNat (Rank sh))
-> (Mixed sh a -> ShX sh Int) -> Mixed sh a -> SNat (Rank sh)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed sh a -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape

-- | The total number of elements in the array.
msize :: Elt a => Mixed sh a -> Int
msize :: forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> Int
msize = IShX sh -> Int
forall (sh :: [Maybe Nat]). IShX sh -> Int
shxSize (IShX sh -> Int) -> (Mixed sh a -> IShX sh) -> Mixed sh a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed sh a -> IShX sh
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape

-- | Create an array given a size and a function that computes the element at a
-- given index.
--
-- __WARNING__: It is required that every @a@ returned by the argument to
-- 'mgenerate' has the same shape. For example, the following will throw a
-- runtime error:
--
-- > foo :: Mixed [Nothing] (Mixed [Nothing] Double)
-- > foo = mgenerate (10 :.: ZIR) $ \(i :.: ZIR) ->
-- >         mgenerate (i :.: ZIR) $ \(j :.: ZIR) ->
-- >           ...
--
-- because the size of the inner 'mgenerate' is not always the same (it depends
-- on @i@). Nested arrays in @ox-arrays@ are always stored fully flattened, so
-- the entire hierarchy (after distributing out tuples) must be a rectangular
-- array. The type of 'mgenerate' allows this requirement to be broken very
-- easily, hence the runtime check.
mgenerate :: forall sh a. KnownElt a => IShX sh -> (IIxX sh -> a) -> Mixed sh a
mgenerate :: forall (sh :: [Maybe Nat]) a.
KnownElt a =>
IShX sh -> (IIxX sh -> a) -> Mixed sh a
mgenerate IShX sh
sh IIxX sh -> a
f = case IShX sh -> [IIxX sh]
forall (sh :: [Maybe Nat]). IShX sh -> [IIxX sh]
shxEnum IShX sh
sh of
  [] -> IShX sh -> Mixed sh a
forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh a
forall a (sh :: [Maybe Nat]). KnownElt a => IShX sh -> Mixed sh a
memptyArrayUnsafe IShX sh
sh
  IIxX sh
firstidx : [IIxX sh]
restidxs ->
    let firstelem :: a
firstelem = IIxX sh -> a
f (IShX sh -> IIxX sh
forall (sh :: [Maybe Nat]). IShX sh -> IIxX sh
ixxZero' IShX sh
sh)
        shapetree :: ShapeTree a
shapetree = a -> ShapeTree a
forall a. Elt a => a -> ShapeTree a
mshapeTree a
firstelem
    in if Proxy a -> ShapeTree a -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> Bool
mshapeTreeEmpty (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) ShapeTree a
shapetree
         then IShX sh -> Mixed sh a
forall (sh :: [Maybe Nat]). IShX sh -> Mixed sh a
forall a (sh :: [Maybe Nat]). KnownElt a => IShX sh -> Mixed sh a
memptyArrayUnsafe IShX sh
sh
         else (forall s. ST s (Mixed sh a)) -> Mixed sh a
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Mixed sh a)) -> Mixed sh a)
-> (forall s. ST s (Mixed sh a)) -> Mixed sh a
forall a b. (a -> b) -> a -> b
$ do
                MixedVecs s sh a
vecs <- IShX sh -> a -> ST s (MixedVecs s sh a)
forall (sh :: [Maybe Nat]) s.
IShX sh -> a -> ST s (MixedVecs s sh a)
forall a (sh :: [Maybe Nat]) s.
KnownElt a =>
IShX sh -> a -> ST s (MixedVecs s sh a)
mvecsUnsafeNew IShX sh
sh a
firstelem
                IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
forall (sh :: [Maybe Nat]) s.
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
mvecsWrite IShX sh
sh IIxX sh
firstidx a
firstelem MixedVecs s sh a
vecs
                -- TODO: This is likely fine if @a@ is big, but if @a@ is a
                -- scalar this array copying inefficient. Should improve this.
                [IIxX sh] -> (IIxX sh -> ST s ()) -> ST s ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [IIxX sh]
restidxs ((IIxX sh -> ST s ()) -> ST s ())
-> (IIxX sh -> ST s ()) -> ST s ()
forall a b. (a -> b) -> a -> b
$ \IIxX sh
idx -> do
                  let val :: a
val = IIxX sh -> a
f IIxX sh
idx
                  Bool -> ST s () -> ST s ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not (Proxy a -> ShapeTree a -> ShapeTree a -> Bool
forall a. Elt a => Proxy a -> ShapeTree a -> ShapeTree a -> Bool
mshapeTreeEq (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @a) (a -> ShapeTree a
forall a. Elt a => a -> ShapeTree a
mshapeTree a
val) ShapeTree a
shapetree)) (ST s () -> ST s ()) -> ST s () -> ST s ()
forall a b. (a -> b) -> a -> b
$
                    String -> ST s ()
forall a. HasCallStack => String -> a
error String
"Data.Array.Nested mgenerate: generated values do not have equal shapes"
                  IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
forall (sh :: [Maybe Nat]) s.
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> IIxX sh -> a -> MixedVecs s sh a -> ST s ()
mvecsWrite IShX sh
sh IIxX sh
idx a
val MixedVecs s sh a
vecs
                IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
forall (sh :: [Maybe Nat]) s.
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
forall a (sh :: [Maybe Nat]) s.
Elt a =>
IShX sh -> MixedVecs s sh a -> ST s (Mixed sh a)
mvecsFreeze IShX sh
sh MixedVecs s sh a
vecs

msumOuter1P :: forall sh n a. (Storable a, NumElt a)
            => Mixed (n : sh) (Primitive a) -> Mixed sh (Primitive a)
msumOuter1P :: forall (sh :: [Maybe Nat]) (n :: Maybe Nat) a.
(Storable a, NumElt a) =>
Mixed (n : sh) (Primitive a) -> Mixed sh (Primitive a)
msumOuter1P (M_Primitive (SMayNat Int SNat n
n :$% ShX sh Int
sh) XArray (n : sh) a
arr) =
  let nssh :: StaticShX '[n]
nssh = ((n ~ 'Nothing) => Int -> SMayNat () SNat n)
-> (forall (m :: Nat).
    (n ~ 'Just m) =>
    SNat m -> SMayNat () SNat n)
-> SMayNat Int SNat n
-> SMayNat () SNat n
forall {k} (n :: Maybe k) i r (f :: k -> *).
((n ~ 'Nothing) => i -> r)
-> (forall (m :: k). (n ~ 'Just m) => f m -> r)
-> SMayNat i f n
-> r
fromSMayNat (\Int
_ -> () -> SMayNat () SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown ()) SNat m -> SMayNat () SNat n
SNat m -> SMayNat () SNat ('Just m)
forall (m :: Nat). (n ~ 'Just m) => SNat m -> SMayNat () SNat n
forall {k} (f :: k -> *) (n1 :: k) i.
f n1 -> SMayNat i f ('Just n1)
SKnown SMayNat Int SNat n
n SMayNat () SNat n -> StaticShX '[] -> StaticShX '[n]
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX
  in IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
ShX sh Int
sh (StaticShX '[n]
-> StaticShX sh -> XArray ('[n] ++ sh) a -> XArray sh a
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
(Storable a, NumElt a) =>
StaticShX sh
-> StaticShX sh' -> XArray (sh ++ sh') a -> XArray sh' a
X.sumOuter StaticShX '[n]
nssh (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
ShX sh Int
sh) XArray (n : sh) a
XArray ('[n] ++ sh) a
arr)

msumOuter1 :: forall sh n a. (NumElt a, PrimElt a)
           => Mixed (n : sh) a -> Mixed sh a
msumOuter1 :: forall (sh :: [Maybe Nat]) (n :: Maybe Nat) a.
(NumElt a, PrimElt a) =>
Mixed (n : sh) a -> Mixed sh a
msumOuter1 = Mixed sh (Primitive a) -> Mixed sh a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive a) -> Mixed sh a)
-> (Mixed (n : sh) a -> Mixed sh (Primitive a))
-> Mixed (n : sh) a
-> Mixed sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (sh :: [Maybe Nat]) (n :: Maybe Nat) a.
(Storable a, NumElt a) =>
Mixed (n : sh) (Primitive a) -> Mixed sh (Primitive a)
msumOuter1P @sh @n @a (Mixed (n : sh) (Primitive a) -> Mixed sh (Primitive a))
-> (Mixed (n : sh) a -> Mixed (n : sh) (Primitive a))
-> Mixed (n : sh) a
-> Mixed sh (Primitive a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed (n : sh) a -> Mixed (n : sh) (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive

msumAllPrim :: (PrimElt a, NumElt a) => Mixed sh a -> a
msumAllPrim :: forall a (sh :: [Maybe Nat]).
(PrimElt a, NumElt a) =>
Mixed sh a -> a
msumAllPrim (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh XArray sh a
arr) = StaticShX sh -> XArray sh a -> a
forall a (sh :: [Maybe Nat]).
(Storable a, NumElt a) =>
StaticShX sh -> XArray sh a -> a
X.sumFull (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) XArray sh a
arr

mappend :: forall n m sh a. Elt a
        => Mixed (n : sh) a -> Mixed (m : sh) a -> Mixed (AddMaybe n m : sh) a
mappend :: forall (n :: Maybe Nat) (m :: Maybe Nat) (sh :: [Maybe Nat]) a.
Elt a =>
Mixed (n : sh) a -> Mixed (m : sh) a -> Mixed (AddMaybe n m : sh) a
mappend Mixed (n : sh) a
arr1 Mixed (m : sh) a
arr2 = StaticShX (AddMaybe n m : sh)
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray ((n : sh) ++ sh') b
    -> XArray ((m : sh) ++ sh') b
    -> XArray ((AddMaybe n m : sh) ++ sh') b)
-> Mixed (n : sh) a
-> Mixed (m : sh) a
-> Mixed (AddMaybe n m : sh) a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh3 :: [Maybe Nat]).
Elt a =>
StaticShX sh3
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh1 ++ sh') b
    -> XArray (sh2 ++ sh') b
    -> XArray (sh3 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
-> Mixed sh3 a
mlift2 (SMayNat () SNat (AddMaybe n m)
snm SMayNat () SNat (AddMaybe n m)
-> StaticShX sh -> StaticShX (AddMaybe n m : sh)
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% StaticShX sh
ssh) StaticShX sh'
-> XArray (n : (sh ++ sh')) b
-> XArray (m : (sh ++ sh')) b
-> XArray (AddMaybe n m : (sh ++ sh')) b
StaticShX sh'
-> XArray ((n : sh) ++ sh') b
-> XArray ((m : sh) ++ sh') b
-> XArray ((AddMaybe n m : sh) ++ sh') b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray (n : (sh ++ sh')) b
-> XArray (m : (sh ++ sh')) b
-> XArray (AddMaybe n m : (sh ++ sh')) b
forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray ((n : sh) ++ sh') b
-> XArray ((m : sh) ++ sh') b
-> XArray ((AddMaybe n m : sh) ++ sh') b
f Mixed (n : sh) a
arr1 Mixed (m : sh) a
arr2
  where
    SMayNat Int SNat n
SMayNat Int SNat n
sn :$% ShX sh Int
ShX sh Int
sh = Mixed (n : sh) a -> ShX (n : sh) Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (n : sh) a
arr1
    SMayNat Int SNat m
SMayNat Int SNat n
sm :$% ShX sh Int
_ = Mixed (m : sh) a -> ShX (m : sh) Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (m : sh) a
arr2
    ssh :: StaticShX sh
ssh = ShX sh Int -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh Int
sh
    snm :: SMayNat () SNat (AddMaybe n m)
    snm :: SMayNat () SNat (AddMaybe n m)
snm = case (SMayNat Int SNat n
sn, SMayNat Int SNat m
sm) of
            (SUnknown{}, SMayNat Int SNat m
_) -> () -> SMayNat () SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown ()
            (SKnown{}, SUnknown{}) -> () -> SMayNat () SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown ()
            (SKnown SNat n1
n, SKnown SNat n1
m) -> SNat (n1 + n1) -> SMayNat () SNat ('Just (n1 + n1))
forall {k} (f :: k -> *) (n1 :: k) i.
f n1 -> SMayNat i f ('Just n1)
SKnown (SNat n1 -> SNat n1 -> SNat (n1 + n1)
forall (n :: Nat) (m :: Nat). SNat n -> SNat m -> SNat (n + m)
snatPlus SNat n1
n SNat n1
m)

    f :: forall sh' b. Storable b
      => StaticShX sh' -> XArray (n : sh ++ sh') b -> XArray (m : sh ++ sh') b -> XArray (AddMaybe n m : sh ++ sh') b
    f :: forall (sh' :: [Maybe Nat]) b.
Storable b =>
StaticShX sh'
-> XArray (n : (sh ++ sh')) b
-> XArray (m : (sh ++ sh')) b
-> XArray (AddMaybe n m : (sh ++ sh')) b
f StaticShX sh'
ssh' = StaticShX (sh ++ sh')
-> XArray (n : (sh ++ sh')) b
-> XArray (m : (sh ++ sh')) b
-> XArray (AddMaybe n m : (sh ++ sh')) b
forall (n :: Maybe Nat) (m :: Maybe Nat) (sh :: [Maybe Nat]) a.
Storable a =>
StaticShX sh
-> XArray (n : sh) a
-> XArray (m : sh) a
-> XArray (AddMaybe n m : sh) a
X.append (StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh
ssh StaticShX sh'
ssh')

mfromVectorP :: forall sh a. Storable a => IShX sh -> VS.Vector a -> Mixed sh (Primitive a)
mfromVectorP :: forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> Vector a -> Mixed sh (Primitive a)
mfromVectorP IShX sh
sh Vector a
v = IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (IShX sh -> Vector a -> XArray sh a
forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> Vector a -> XArray sh a
X.fromVector IShX sh
sh Vector a
v)

mfromVector :: forall sh a. PrimElt a => IShX sh -> VS.Vector a -> Mixed sh a
mfromVector :: forall (sh :: [Maybe Nat]) a.
PrimElt a =>
IShX sh -> Vector a -> Mixed sh a
mfromVector IShX sh
sh Vector a
v = Mixed sh (Primitive a) -> Mixed sh a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (IShX sh -> Vector a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> Vector a -> Mixed sh (Primitive a)
mfromVectorP IShX sh
sh Vector a
v)

mtoVectorP :: Storable a => Mixed sh (Primitive a) -> VS.Vector a
mtoVectorP :: forall a (sh :: [Maybe Nat]).
Storable a =>
Mixed sh (Primitive a) -> Vector a
mtoVectorP (M_Primitive IShX sh
_ XArray sh a
v) = XArray sh a -> Vector a
forall a (sh :: [Maybe Nat]). Storable a => XArray sh a -> Vector a
X.toVector XArray sh a
v

mtoVector :: PrimElt a => Mixed sh a -> VS.Vector a
mtoVector :: forall a (sh :: [Maybe Nat]). PrimElt a => Mixed sh a -> Vector a
mtoVector Mixed sh a
arr = Mixed sh (Primitive a) -> Vector a
forall a (sh :: [Maybe Nat]).
Storable a =>
Mixed sh (Primitive a) -> Vector a
mtoVectorP (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive Mixed sh a
arr)

mfromList1 :: Elt a => NonEmpty a -> Mixed '[Nothing] a
mfromList1 :: forall a. Elt a => NonEmpty a -> Mixed '[ 'Nothing] a
mfromList1 = NonEmpty (Mixed '[] a) -> Mixed '[ 'Nothing] a
forall (sh :: [Maybe Nat]).
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
forall a (sh :: [Maybe Nat]).
Elt a =>
NonEmpty (Mixed sh a) -> Mixed ('Nothing : sh) a
mfromListOuter (NonEmpty (Mixed '[] a) -> Mixed '[ 'Nothing] a)
-> (NonEmpty a -> NonEmpty (Mixed '[] a))
-> NonEmpty a
-> Mixed '[ 'Nothing] a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Mixed '[] a) -> NonEmpty a -> NonEmpty (Mixed '[] a)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Mixed '[] a
forall a. Elt a => a -> Mixed '[] a
mscalar  -- TODO: optimise?

-- This forall is there so that a simple type application can constrain the
-- shape, in case the user wants to use OverloadedLists for the shape.
mfromListLinear :: forall sh a. Elt a => IShX sh -> NonEmpty a -> Mixed sh a
mfromListLinear :: forall (sh :: [Maybe Nat]) a.
Elt a =>
IShX sh -> NonEmpty a -> Mixed sh a
mfromListLinear IShX sh
sh NonEmpty a
l = IShX sh -> Mixed '[ 'Nothing] a -> Mixed sh a
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Elt a =>
IShX sh' -> Mixed sh a -> Mixed sh' a
mreshape IShX sh
sh (NonEmpty a -> Mixed '[ 'Nothing] a
forall a. Elt a => NonEmpty a -> Mixed '[ 'Nothing] a
mfromList1 NonEmpty a
l)

mfromListPrim :: PrimElt a => [a] -> Mixed '[Nothing] a
mfromListPrim :: forall a. PrimElt a => [a] -> Mixed '[ 'Nothing] a
mfromListPrim [a]
l =
  let ssh :: StaticShX '[ 'Nothing]
ssh = () -> SMayNat () SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown () SMayNat () SNat 'Nothing -> StaticShX '[] -> StaticShX '[ 'Nothing]
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX
      xarr :: XArray '[ 'Nothing] a
xarr = StaticShX '[ 'Nothing] -> [a] -> XArray '[ 'Nothing] a
forall a (n :: Maybe Nat).
Storable a =>
StaticShX '[n] -> [a] -> XArray '[n] a
X.fromList1 StaticShX '[ 'Nothing]
ssh [a]
l
  in Mixed '[ 'Nothing] (Primitive a) -> Mixed '[ 'Nothing] a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed '[ 'Nothing] (Primitive a) -> Mixed '[ 'Nothing] a)
-> Mixed '[ 'Nothing] (Primitive a) -> Mixed '[ 'Nothing] a
forall a b. (a -> b) -> a -> b
$ IShX '[ 'Nothing]
-> XArray '[ 'Nothing] a -> Mixed '[ 'Nothing] (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (StaticShX '[ 'Nothing]
-> XArray '[ 'Nothing] a -> IShX '[ 'Nothing]
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape StaticShX '[ 'Nothing]
ssh XArray '[ 'Nothing] a
xarr) XArray '[ 'Nothing] a
xarr

mfromListPrimLinear :: PrimElt a => IShX sh -> [a] -> Mixed sh a
mfromListPrimLinear :: forall a (sh :: [Maybe Nat]).
PrimElt a =>
IShX sh -> [a] -> Mixed sh a
mfromListPrimLinear IShX sh
sh [a]
l =
  let M_Primitive IShX '[ 'Nothing]
_ XArray '[ 'Nothing] a
xarr = Mixed '[ 'Nothing] a -> Mixed '[ 'Nothing] (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive ([a] -> Mixed '[ 'Nothing] a
forall a. PrimElt a => [a] -> Mixed '[ 'Nothing] a
mfromListPrim [a]
l)
  in Mixed sh (Primitive a) -> Mixed sh a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive a) -> Mixed sh a)
-> Mixed sh (Primitive a) -> Mixed sh a
forall a b. (a -> b) -> a -> b
$ IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (StaticShX '[ 'Nothing]
-> IShX sh -> XArray '[ 'Nothing] a -> XArray sh a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
Storable a =>
StaticShX sh1 -> IShX sh2 -> XArray sh1 a -> XArray sh2 a
X.reshape (() -> SMayNat () SNat 'Nothing
forall {k} i (f :: k -> *). i -> SMayNat i f 'Nothing
SUnknown () SMayNat () SNat 'Nothing -> StaticShX '[] -> StaticShX '[ 'Nothing]
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX) IShX sh
sh XArray '[ 'Nothing] a
xarr)

mtoList :: Elt a => Mixed '[n] a -> [a]
mtoList :: forall a (n :: Maybe Nat). Elt a => Mixed '[n] a -> [a]
mtoList = (Mixed '[] a -> a) -> [Mixed '[] a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map Mixed '[] a -> a
forall a. Elt a => Mixed '[] a -> a
munScalar ([Mixed '[] a] -> [a])
-> (Mixed '[n] a -> [Mixed '[] a]) -> Mixed '[n] a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed '[n] a -> [Mixed '[] a]
forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
Mixed (n : sh) a -> [Mixed sh a]
forall a (n :: Maybe Nat) (sh :: [Maybe Nat]).
Elt a =>
Mixed (n : sh) a -> [Mixed sh a]
mtoListOuter

mtoListLinear :: Elt a => Mixed sh a -> [a]
mtoListLinear :: forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> [a]
mtoListLinear Mixed sh a
arr = (IIxX sh -> a) -> [IIxX sh] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (Mixed sh a -> IIxX sh -> a
forall (sh :: [Maybe Nat]). Mixed sh a -> IIxX sh -> a
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IIxX sh -> a
mindex Mixed sh a
arr) (IShX sh -> [IIxX sh]
forall (sh :: [Maybe Nat]). IShX sh -> [IIxX sh]
shxEnum (Mixed sh a -> IShX sh
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
arr))  -- TODO: optimise

munScalar :: Elt a => Mixed '[] a -> a
munScalar :: forall a. Elt a => Mixed '[] a -> a
munScalar Mixed '[] a
arr = Mixed '[] a -> IIxX '[] -> a
forall (sh :: [Maybe Nat]). Mixed sh a -> IIxX sh -> a
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IIxX sh -> a
mindex Mixed '[] a
arr IIxX '[]
forall (sh :: [Maybe Nat]) i. (sh ~ '[]) => IxX sh i
ZIX

mnest :: forall sh sh' a. Elt a => StaticShX sh -> Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a)
mnest :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Elt a =>
StaticShX sh -> Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a)
mnest StaticShX sh
ssh Mixed (sh ++ sh') a
arr = IShX sh -> Mixed (sh ++ sh') a -> Mixed sh (Mixed sh' a)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]) a.
IShX sh1 -> Mixed (sh1 ++ sh2) a -> Mixed sh1 (Mixed sh2 a)
M_Nest ((IShX sh, ShX sh' Int) -> IShX sh
forall a b. (a, b) -> a
fst (Proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') Int -> (IShX sh, ShX sh' Int)
forall (proxy :: [Maybe Nat] -> *) (sh' :: [Maybe Nat])
       (sh :: [Maybe Nat]) i.
proxy sh'
-> StaticShX sh -> ShX (sh ++ sh') i -> (ShX sh i, ShX sh' i)
shxSplitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') StaticShX sh
ssh (Mixed (sh ++ sh') a -> ShX (sh ++ sh') Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (sh ++ sh') a
arr))) Mixed (sh ++ sh') a
arr

munNest :: Mixed sh (Mixed sh' a) -> Mixed (sh ++ sh') a
munNest :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Mixed sh (Mixed sh' a) -> Mixed (sh ++ sh') a
munNest (M_Nest IShX sh
_ Mixed (sh ++ sh') a
arr) = Mixed (sh ++ sh') a
arr

-- | The arguments must have equal shapes. If they do not, an error is raised.
mzip :: (Elt a, Elt b) => Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
mzip :: forall a b (sh :: [Maybe Nat]).
(Elt a, Elt b) =>
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
mzip Mixed sh a
a Mixed sh b
b
  | Just sh :~: sh
Refl <- ShX sh Int -> ShX sh Int -> Maybe (sh :~: sh)
forall i (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
Eq i =>
ShX sh i -> ShX sh' i -> Maybe (sh :~: sh')
shxEqual (Mixed sh a -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
a) (Mixed sh b -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh b -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh b
b) = Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
forall (sh :: [Maybe Nat]) a b.
Mixed sh a -> Mixed sh b -> Mixed sh (a, b)
M_Tup2 Mixed sh a
a Mixed sh b
b
  | Bool
otherwise = String -> Mixed sh (a, b)
forall a. HasCallStack => String -> a
error String
"mzip: unequal shapes"

munzip :: Mixed sh (a, b) -> (Mixed sh a, Mixed sh b)
munzip :: forall (sh :: [Maybe Nat]) a b.
Mixed sh (a, b) -> (Mixed sh a, Mixed sh b)
munzip (M_Tup2 Mixed sh a
a Mixed sh b
b) = (Mixed sh a
a, Mixed sh b
b)

mrerankP :: forall sh1 sh2 sh a b. (Storable a, Storable b)
         => StaticShX sh -> IShX sh2
         -> (Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive b))
         -> Mixed (sh ++ sh1) (Primitive a) -> Mixed (sh ++ sh2) (Primitive b)
mrerankP :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh :: [Maybe Nat]) a b.
(Storable a, Storable b) =>
StaticShX sh
-> IShX sh2
-> (Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive b))
-> Mixed (sh ++ sh1) (Primitive a)
-> Mixed (sh ++ sh2) (Primitive b)
mrerankP StaticShX sh
ssh IShX sh2
sh2 Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive b)
f (M_Primitive IShX (sh ++ sh1)
sh XArray (sh ++ sh1) a
arr) =
  let sh1 :: ShX sh1 Int
sh1 = StaticShX sh -> IShX (sh ++ sh1) -> ShX sh1 Int
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
StaticShX sh -> ShX (sh ++ sh') i -> ShX sh' i
shxDropSSX StaticShX sh
ssh IShX (sh ++ sh1)
sh
  in IShX (sh ++ sh2)
-> XArray (sh ++ sh2) b -> Mixed (sh ++ sh2) (Primitive b)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (ShX sh Int -> IShX sh2 -> IShX (sh ++ sh2)
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i.
ShX sh i -> ShX sh' i -> ShX (sh ++ sh') i
shxAppend (Proxy sh1 -> StaticShX sh -> IShX (sh ++ sh1) -> ShX sh Int
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) i
       (proxy :: [Maybe Nat] -> *).
proxy sh' -> StaticShX sh -> ShX (sh ++ sh') i -> ShX sh i
shxTakeSSX (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh1) StaticShX sh
ssh IShX (sh ++ sh1)
sh) IShX sh2
sh2)
                 (StaticShX sh
-> StaticShX sh1
-> StaticShX sh2
-> (XArray sh1 a -> XArray sh2 b)
-> XArray (sh ++ sh1) a
-> XArray (sh ++ sh2) b
forall (sh :: [Maybe Nat]) (sh1 :: [Maybe Nat])
       (sh2 :: [Maybe Nat]) a b.
(Storable a, Storable b) =>
StaticShX sh
-> StaticShX sh1
-> StaticShX sh2
-> (XArray sh1 a -> XArray sh2 b)
-> XArray (sh ++ sh1) a
-> XArray (sh ++ sh2) b
X.rerank StaticShX sh
ssh (ShX sh1 Int -> StaticShX sh1
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh1 Int
sh1) (IShX sh2 -> StaticShX sh2
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh2
sh2)
                           (\XArray sh1 a
a -> let M_Primitive IShX sh2
_ XArray sh2 b
r = Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive b)
f (ShX sh1 Int -> XArray sh1 a -> Mixed sh1 (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive ShX sh1 Int
sh1 XArray sh1 a
a) in XArray sh2 b
r)
                           XArray (sh ++ sh1) a
arr)

-- | See the caveats at @X.rerank@.
mrerank :: forall sh1 sh2 sh a b. (PrimElt a, PrimElt b)
        => StaticShX sh -> IShX sh2
        -> (Mixed sh1 a -> Mixed sh2 b)
        -> Mixed (sh ++ sh1) a -> Mixed (sh ++ sh2) b
mrerank :: forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh :: [Maybe Nat]) a b.
(PrimElt a, PrimElt b) =>
StaticShX sh
-> IShX sh2
-> (Mixed sh1 a -> Mixed sh2 b)
-> Mixed (sh ++ sh1) a
-> Mixed (sh ++ sh2) b
mrerank StaticShX sh
ssh IShX sh2
sh2 Mixed sh1 a -> Mixed sh2 b
f (Mixed (sh ++ sh1) a -> Mixed (sh ++ sh1) (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> Mixed (sh ++ sh1) (Primitive a)
arr) =
  Mixed (sh ++ sh2) (Primitive b) -> Mixed (sh ++ sh2) b
forall (sh :: [Maybe Nat]). Mixed sh (Primitive b) -> Mixed sh b
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed (sh ++ sh2) (Primitive b) -> Mixed (sh ++ sh2) b)
-> Mixed (sh ++ sh2) (Primitive b) -> Mixed (sh ++ sh2) b
forall a b. (a -> b) -> a -> b
$ StaticShX sh
-> IShX sh2
-> (Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive b))
-> Mixed (sh ++ sh1) (Primitive a)
-> Mixed (sh ++ sh2) (Primitive b)
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh :: [Maybe Nat]) a b.
(Storable a, Storable b) =>
StaticShX sh
-> IShX sh2
-> (Mixed sh1 (Primitive a) -> Mixed sh2 (Primitive b))
-> Mixed (sh ++ sh1) (Primitive a)
-> Mixed (sh ++ sh2) (Primitive b)
mrerankP StaticShX sh
ssh IShX sh2
sh2 (Mixed sh2 b -> Mixed sh2 (Primitive b)
forall (sh :: [Maybe Nat]). Mixed sh b -> Mixed sh (Primitive b)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive (Mixed sh2 b -> Mixed sh2 (Primitive b))
-> (Mixed sh1 (Primitive a) -> Mixed sh2 b)
-> Mixed sh1 (Primitive a)
-> Mixed sh2 (Primitive b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed sh1 a -> Mixed sh2 b
f (Mixed sh1 a -> Mixed sh2 b)
-> (Mixed sh1 (Primitive a) -> Mixed sh1 a)
-> Mixed sh1 (Primitive a)
-> Mixed sh2 b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed sh1 (Primitive a) -> Mixed sh1 a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive) Mixed (sh ++ sh1) (Primitive a)
arr

mreplicate :: forall sh sh' a. Elt a
           => IShX sh -> Mixed sh' a -> Mixed (sh ++ sh') a
mreplicate :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Elt a =>
IShX sh -> Mixed sh' a -> Mixed (sh ++ sh') a
mreplicate IShX sh
sh Mixed sh' a
arr =
  let ssh' :: StaticShX sh'
ssh' = ShX sh' Int -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX (Mixed sh' a -> ShX sh' Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh' a
arr)
  in StaticShX (sh ++ sh')
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (sh' ++ sh') b -> XArray ((sh ++ sh') ++ sh') b)
-> Mixed sh' a
-> Mixed (sh ++ sh') a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift (StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) StaticShX sh'
ssh')
           (\(StaticShX sh'
sshT :: StaticShX shT) ->
              case Proxy sh
-> Proxy sh'
-> Proxy sh'
-> ((sh ++ sh') ++ sh') :~: (sh ++ (sh' ++ sh'))
forall {a1} (a2 :: [a1]) (b :: [a1]) (c :: [a1]).
Proxy a2
-> Proxy b -> Proxy c -> ((a2 ++ b) ++ c) :~: (a2 ++ (b ++ c))
lemAppAssoc (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh) (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh') (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @shT) of
                ((sh ++ sh') ++ sh') :~: (sh ++ (sh' ++ sh'))
Refl -> IShX sh
-> StaticShX (sh' ++ sh')
-> XArray (sh' ++ sh') b
-> XArray (sh ++ (sh' ++ sh')) b
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Storable a =>
IShX sh -> StaticShX sh' -> XArray sh' a -> XArray (sh ++ sh') a
X.replicate IShX sh
sh (StaticShX sh' -> StaticShX sh' -> StaticShX (sh' ++ sh')
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]).
StaticShX sh -> StaticShX sh' -> StaticShX (sh ++ sh')
ssxAppend StaticShX sh'
ssh' StaticShX sh'
sshT))
           Mixed sh' a
arr

mreplicateScalP :: forall sh a. Storable a => IShX sh -> a -> Mixed sh (Primitive a)
mreplicateScalP :: forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> a -> Mixed sh (Primitive a)
mreplicateScalP IShX sh
sh a
x = IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (IShX sh -> a -> XArray sh a
forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> a -> XArray sh a
X.replicateScal IShX sh
sh a
x)

mreplicateScal :: forall sh a. PrimElt a
               => IShX sh -> a -> Mixed sh a
mreplicateScal :: forall (sh :: [Maybe Nat]) a.
PrimElt a =>
IShX sh -> a -> Mixed sh a
mreplicateScal IShX sh
sh a
x = Mixed sh (Primitive a) -> Mixed sh a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (IShX sh -> a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
Storable a =>
IShX sh -> a -> Mixed sh (Primitive a)
mreplicateScalP IShX sh
sh a
x)

mslice :: Elt a => SNat i -> SNat n -> Mixed (Just (i + n + k) : sh) a -> Mixed (Just n : sh) a
mslice :: forall a (i :: Nat) (n :: Nat) (k :: Nat) (sh :: [Maybe Nat]).
Elt a =>
SNat i
-> SNat n
-> Mixed ('Just ((i + n) + k) : sh) a
-> Mixed ('Just n : sh) a
mslice SNat i
i SNat n
n Mixed ('Just ((i + n) + k) : sh) a
arr =
  let SMayNat Int SNat n
_ :$% ShX sh Int
ShX sh Int
sh = Mixed ('Just ((i + n) + k) : sh) a
-> ShX ('Just ((i + n) + k) : sh) Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed ('Just ((i + n) + k) : sh) a
arr
  in StaticShX ('Just n : sh)
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (('Just ((i + n) + k) : sh) ++ sh') b
    -> XArray (('Just n : sh) ++ sh') b)
-> Mixed ('Just ((i + n) + k) : sh) a
-> Mixed ('Just n : sh) a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift (SNat n -> SMayNat () SNat ('Just n)
forall {k} (f :: k -> *) (n1 :: k) i.
f n1 -> SMayNat i f ('Just n1)
SKnown SNat n
n SMayNat () SNat ('Just n)
-> StaticShX sh -> StaticShX ('Just n : sh)
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% ShX sh Int -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX ShX sh Int
sh) (\StaticShX sh'
_ -> SNat i
-> SNat n
-> XArray ('Just ((i + n) + k) : (sh ++ sh')) b
-> XArray ('Just n : (sh ++ sh')) b
forall (i :: Nat) (n :: Nat) (k :: Nat) (sh :: [Maybe Nat]) a.
SNat i
-> SNat n
-> XArray ('Just ((i + n) + k) : sh) a
-> XArray ('Just n : sh) a
X.slice SNat i
i SNat n
n) Mixed ('Just ((i + n) + k) : sh) a
arr

msliceU :: Elt a => Int -> Int -> Mixed (Nothing : sh) a -> Mixed (Nothing : sh) a
msliceU :: forall a (sh :: [Maybe Nat]).
Elt a =>
Int -> Int -> Mixed ('Nothing : sh) a -> Mixed ('Nothing : sh) a
msliceU Int
i Int
n Mixed ('Nothing : sh) a
arr = StaticShX ('Nothing : sh)
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray (('Nothing : sh) ++ sh') b
    -> XArray (('Nothing : sh) ++ sh') b)
-> Mixed ('Nothing : sh) a
-> Mixed ('Nothing : sh) a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift (ShX ('Nothing : sh) Int -> StaticShX ('Nothing : sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX (Mixed ('Nothing : sh) a -> ShX ('Nothing : sh) Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed ('Nothing : sh) a
arr)) (\StaticShX sh'
_ -> Int
-> Int
-> XArray ('Nothing : (sh ++ sh')) b
-> XArray ('Nothing : (sh ++ sh')) b
forall (sh :: [Maybe Nat]) a.
Int -> Int -> XArray ('Nothing : sh) a -> XArray ('Nothing : sh) a
X.sliceU Int
i Int
n) Mixed ('Nothing : sh) a
arr

mrev1 :: Elt a => Mixed (n : sh) a -> Mixed (n : sh) a
mrev1 :: forall a (n :: Maybe Nat) (sh :: [Maybe Nat]).
Elt a =>
Mixed (n : sh) a -> Mixed (n : sh) a
mrev1 Mixed (n : sh) a
arr = StaticShX (n : sh)
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh'
    -> XArray ((n : sh) ++ sh') b -> XArray ((n : sh) ++ sh') b)
-> Mixed (n : sh) a
-> Mixed (n : sh) a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift (ShX (n : sh) Int -> StaticShX (n : sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX (Mixed (n : sh) a -> ShX (n : sh) Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed (n : sh) a
arr)) (\StaticShX sh'
_ -> XArray (n : (sh ++ sh')) b -> XArray (n : (sh ++ sh')) b
XArray ((n : sh) ++ sh') b -> XArray ((n : sh) ++ sh') b
forall (n :: Maybe Nat) (sh :: [Maybe Nat]) a.
XArray (n : sh) a -> XArray (n : sh) a
X.rev1) Mixed (n : sh) a
arr

mreshape :: forall sh sh' a. Elt a => IShX sh' -> Mixed sh a -> Mixed sh' a
mreshape :: forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Elt a =>
IShX sh' -> Mixed sh a -> Mixed sh' a
mreshape IShX sh'
sh' Mixed sh a
arr =
  StaticShX sh'
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh ++ sh') b -> XArray (sh' ++ sh') b)
-> Mixed sh a
-> Mixed sh' a
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
forall a (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
Elt a =>
StaticShX sh2
-> (forall (sh' :: [Maybe Nat]) b.
    Storable b =>
    StaticShX sh' -> XArray (sh1 ++ sh') b -> XArray (sh2 ++ sh') b)
-> Mixed sh1 a
-> Mixed sh2 a
mlift (IShX sh' -> StaticShX sh'
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh'
sh')
        (\StaticShX sh'
sshIn -> StaticShX sh
-> StaticShX sh'
-> IShX sh'
-> XArray (sh ++ sh') b
-> XArray (sh' ++ sh') b
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat])
       (sh' :: [Maybe Nat]) a.
Storable a =>
StaticShX sh1
-> StaticShX sh'
-> IShX sh2
-> XArray (sh1 ++ sh') a
-> XArray (sh2 ++ sh') a
X.reshapePartial (ShX sh Int -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX (Mixed sh a -> ShX sh Int
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
arr)) StaticShX sh'
sshIn IShX sh'
sh')
        Mixed sh a
arr

mflatten :: Elt a => Mixed sh a -> Mixed '[Flatten sh] a
mflatten :: forall a (sh :: [Maybe Nat]).
Elt a =>
Mixed sh a -> Mixed '[Flatten sh] a
mflatten Mixed sh a
arr = IShX '[Flatten' 1 sh] -> Mixed sh a -> Mixed '[Flatten' 1 sh] a
forall (sh :: [Maybe Nat]) (sh' :: [Maybe Nat]) a.
Elt a =>
IShX sh' -> Mixed sh a -> Mixed sh' a
mreshape (IShX sh -> SMayNat Int SNat (Flatten' 1 sh)
forall (sh :: [Maybe Nat]).
IShX sh -> SMayNat Int SNat (Flatten sh)
shxFlatten (Mixed sh a -> IShX sh
forall (sh :: [Maybe Nat]). Mixed sh a -> IShX sh
forall a (sh :: [Maybe Nat]). Elt a => Mixed sh a -> IShX sh
mshape Mixed sh a
arr) SMayNat Int SNat (Flatten' 1 sh)
-> IShX '[] -> IShX '[Flatten' 1 sh]
forall {sh1 :: [Maybe Nat]} {i} (n :: Maybe Nat)
       (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat i SNat n -> ShX sh i -> ShX sh1 i
:$% IShX '[]
forall (sh :: [Maybe Nat]) i. (sh ~ '[]) => ShX sh i
ZSX) Mixed sh a
arr

miota :: (Enum a, PrimElt a) => SNat n -> Mixed '[Just n] a
miota :: forall a (n :: Nat).
(Enum a, PrimElt a) =>
SNat n -> Mixed '[ 'Just n] a
miota SNat n
sn = Mixed '[ 'Just n] (Primitive a) -> Mixed '[ 'Just n] a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed '[ 'Just n] (Primitive a) -> Mixed '[ 'Just n] a)
-> Mixed '[ 'Just n] (Primitive a) -> Mixed '[ 'Just n] a
forall a b. (a -> b) -> a -> b
$ IShX '[ 'Just n]
-> XArray '[ 'Just n] a -> Mixed '[ 'Just n] (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (SNat n -> SMayNat Int SNat ('Just n)
forall {k} (f :: k -> *) (n1 :: k) i.
f n1 -> SMayNat i f ('Just n1)
SKnown SNat n
sn SMayNat Int SNat ('Just n) -> IShX '[] -> IShX '[ 'Just n]
forall {sh1 :: [Maybe Nat]} {i} (n :: Maybe Nat)
       (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat i SNat n -> ShX sh i -> ShX sh1 i
:$% IShX '[]
forall (sh :: [Maybe Nat]) i. (sh ~ '[]) => ShX sh i
ZSX) (SNat n -> XArray '[ 'Just n] a
forall a (n :: Nat).
(Enum a, Storable a) =>
SNat n -> XArray '[ 'Just n] a
X.iota SNat n
sn)

-- | Throws if the array is empty.
mminIndexPrim :: (PrimElt a, NumElt a) => Mixed sh a -> IIxX sh
mminIndexPrim :: forall a (sh :: [Maybe Nat]).
(PrimElt a, NumElt a) =>
Mixed sh a -> IIxX sh
mminIndexPrim (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh (XArray Array (Rank sh) a
arr)) =
  StaticShX sh -> [Int] -> IxX sh Int
forall (sh :: [Maybe Nat]) i. StaticShX sh -> [i] -> IxX sh i
ixxFromList (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) (SNat (Rank sh) -> Array (Rank sh) a -> [Int]
forall (n :: Nat). SNat n -> Array n a -> [Int]
forall a (n :: Nat). NumElt a => SNat n -> Array n a -> [Int]
numEltMinIndex (IShX sh -> SNat (Rank sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> SNat (Rank sh)
shxRank IShX sh
sh) (Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a. Array n a -> Array n a
fromO Array (Rank sh) a
arr))

-- | Throws if the array is empty.
mmaxIndexPrim :: (PrimElt a, NumElt a) => Mixed sh a -> IIxX sh
mmaxIndexPrim :: forall a (sh :: [Maybe Nat]).
(PrimElt a, NumElt a) =>
Mixed sh a -> IIxX sh
mmaxIndexPrim (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh (XArray Array (Rank sh) a
arr)) =
  StaticShX sh -> [Int] -> IxX sh Int
forall (sh :: [Maybe Nat]) i. StaticShX sh -> [i] -> IxX sh i
ixxFromList (IShX sh -> StaticShX sh
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX sh
sh) (SNat (Rank sh) -> Array (Rank sh) a -> [Int]
forall (n :: Nat). SNat n -> Array n a -> [Int]
forall a (n :: Nat). NumElt a => SNat n -> Array n a -> [Int]
numEltMaxIndex (IShX sh -> SNat (Rank sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> SNat (Rank sh)
shxRank IShX sh
sh) (Array (Rank sh) a -> Array (Rank sh) a
forall (n :: Nat) a. Array n a -> Array n a
fromO Array (Rank sh) a
arr))

mdot1Inner :: forall sh n a. (PrimElt a, NumElt a)
           => Proxy n -> Mixed (sh ++ '[n]) a -> Mixed (sh ++ '[n]) a -> Mixed sh a
mdot1Inner :: forall (sh :: [Maybe Nat]) (n :: Maybe Nat) a.
(PrimElt a, NumElt a) =>
Proxy n
-> Mixed (sh ++ '[n]) a -> Mixed (sh ++ '[n]) a -> Mixed sh a
mdot1Inner Proxy n
_ (Mixed (sh ++ '[n]) a -> Mixed (sh ++ '[n]) (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX (sh ++ '[n])
sh1 (XArray Array (Rank (sh ++ '[n])) a
a)) (Mixed (sh ++ '[n]) a -> Mixed (sh ++ '[n]) (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX (sh ++ '[n])
sh2 (XArray Array (Rank (sh ++ '[n])) a
b))
  | Init (sh ++ '[n]) :~: sh
Refl <- Proxy sh -> Proxy n -> Init (sh ++ '[n]) :~: sh
forall {a} (l :: [a]) (x :: a).
Proxy l -> Proxy x -> Init (l ++ '[x]) :~: l
lemInitApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh) (forall (t :: Maybe Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n)
  , Last (sh ++ '[n]) :~: n
Refl <- Proxy sh -> Proxy n -> Last (sh ++ '[n]) :~: n
forall {k} (l :: [k]) (x :: k).
Proxy l -> Proxy x -> Last (l ++ '[x]) :~: x
lemLastApp (forall (t :: [Maybe Nat]). Proxy t
forall {k} (t :: k). Proxy t
Proxy @sh) (forall (t :: Maybe Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n)
  = case IShX (sh ++ '[n])
sh1 of
      SMayNat Int SNat n
_ :$% ShX sh Int
_
        | IShX (sh ++ '[n])
sh1 IShX (sh ++ '[n]) -> IShX (sh ++ '[n]) -> Bool
forall a. Eq a => a -> a -> Bool
== IShX (sh ++ '[n])
sh2
        , Rank (Init (n : sh) ++ '[Last (n : sh)])
:~: (Rank (Init (n : sh)) + Rank '[Last (n : sh)])
Refl <- StaticShX (Init (n : sh))
-> StaticShX '[Last (n : sh)]
-> Rank (Init (n : sh) ++ '[Last (n : sh)])
   :~: (Rank (Init (n : sh)) + Rank '[Last (n : sh)])
forall (sh1 :: [Maybe Nat]) (sh2 :: [Maybe Nat]).
StaticShX sh1
-> StaticShX sh2 -> Rank (sh1 ++ sh2) :~: (Rank sh1 + Rank sh2)
lemRankApp (StaticShX (n : sh) -> StaticShX (Init (n : sh))
forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
StaticShX (n : sh) -> StaticShX (Init (n : sh))
ssxInit (IShX (n : sh) -> StaticShX (n : sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX (n : sh)
IShX (sh ++ '[n])
sh1)) (StaticShX (n : sh) -> SMayNat () SNat (Last (n : sh))
forall (n :: Maybe Nat) (sh :: [Maybe Nat]).
StaticShX (n : sh) -> SMayNat () SNat (Last (n : sh))
ssxLast (IShX (n : sh) -> StaticShX (n : sh)
forall (sh :: [Maybe Nat]) i. ShX sh i -> StaticShX sh
ssxFromShX IShX (n : sh)
IShX (sh ++ '[n])
sh1) SMayNat () SNat (Last (n : sh))
-> StaticShX '[] -> StaticShX '[Last (n : sh)]
forall {sh1 :: [Maybe Nat]} (n :: Maybe Nat) (sh :: [Maybe Nat]).
((n : sh) ~ sh1) =>
SMayNat () SNat n -> StaticShX sh -> StaticShX sh1
:!% StaticShX '[]
forall (sh :: [Maybe Nat]). (sh ~ '[]) => StaticShX sh
ZKX) ->
            Mixed sh (Primitive a) -> Mixed sh a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive a) -> Mixed sh a)
-> Mixed sh (Primitive a) -> Mixed sh a
forall a b. (a -> b) -> a -> b
$ IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (IShX (n : sh) -> ShX (Init (n : sh)) Int
forall (n :: Maybe Nat) (sh :: [Maybe Nat]) i.
ShX (n : sh) i -> ShX (Init (n : sh)) i
shxInit IShX (n : sh)
IShX (sh ++ '[n])
sh1) (Array (Rank sh) a -> XArray sh a
forall (sh :: [Maybe Nat]) a. Array (Rank sh) a -> XArray sh a
XArray ((Array (Rank sh + 1) a
 -> Array (Rank sh + 1) a -> Array (Rank sh) a)
-> Array (Rank sh + 1) a
-> Array (Rank sh + 1) a
-> Array (Rank sh) a
forall (n :: Nat) a (n1 :: Nat) b (n2 :: Nat) c.
(Array n a -> Array n1 b -> Array n2 c)
-> Array n a -> Array n1 b -> Array n2 c
liftO2 (SNat (Rank sh)
-> Array (Rank sh + 1) a
-> Array (Rank sh + 1) a
-> Array (Rank sh) a
forall (n :: Nat).
SNat n -> Array (n + 1) a -> Array (n + 1) a -> Array n a
forall a (n :: Nat).
NumElt a =>
SNat n -> Array (n + 1) a -> Array (n + 1) a -> Array n a
numEltDotprodInner (ShX (Init (n : sh)) Int -> SNat (Rank (Init (n : sh)))
forall (sh :: [Maybe Nat]) i. ShX sh i -> SNat (Rank sh)
shxRank (IShX (n : sh) -> ShX (Init (n : sh)) Int
forall (n :: Maybe Nat) (sh :: [Maybe Nat]) i.
ShX (n : sh) i -> ShX (Init (n : sh)) i
shxInit IShX (n : sh)
IShX (sh ++ '[n])
sh1))) Array (Rank sh + 1) a
Array (Rank (sh ++ '[n])) a
a Array (Rank sh + 1) a
Array (Rank (sh ++ '[n])) a
b))
        | Bool
otherwise -> String -> Mixed sh a
forall a. HasCallStack => String -> a
error (String -> Mixed sh a) -> String -> Mixed sh a
forall a b. (a -> b) -> a -> b
$ String
"mdot1Inner: Unequal shapes (" String -> ShowS
forall a. [a] -> [a] -> [a]
++ IShX (sh ++ '[n]) -> String
forall a. Show a => a -> String
show IShX (sh ++ '[n])
sh1 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" and " String -> ShowS
forall a. [a] -> [a] -> [a]
++ IShX (sh ++ '[n]) -> String
forall a. Show a => a -> String
show IShX (sh ++ '[n])
sh2 String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
")"
      IShX (sh ++ '[n])
ZSX -> String -> Mixed sh a
forall a. HasCallStack => String -> a
error String
"unreachable"

-- | This has a temporary, suboptimal implementation in terms of 'mflatten'.
-- Prefer 'mdot1Inner' if applicable.
mdot :: (PrimElt a, NumElt a) => Mixed sh a -> Mixed sh a -> a
mdot :: forall a (sh :: [Maybe Nat]).
(PrimElt a, NumElt a) =>
Mixed sh a -> Mixed sh a -> a
mdot Mixed sh a
a Mixed sh a
b =
  Mixed '[] a -> a
forall a. Elt a => Mixed '[] a -> a
munScalar (Mixed '[] a -> a) -> Mixed '[] a -> a
forall a b. (a -> b) -> a -> b
$
    Proxy (Flatten' 1 sh)
-> Mixed ('[] ++ '[Flatten' 1 sh]) a
-> Mixed ('[] ++ '[Flatten' 1 sh]) a
-> Mixed '[] a
forall (sh :: [Maybe Nat]) (n :: Maybe Nat) a.
(PrimElt a, NumElt a) =>
Proxy n
-> Mixed (sh ++ '[n]) a -> Mixed (sh ++ '[n]) a -> Mixed sh a
mdot1Inner Proxy (Flatten' 1 sh)
forall {k} (t :: k). Proxy t
Proxy (Mixed '[Flatten' 1 sh] (Primitive a) -> Mixed '[Flatten' 1 sh] a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive a) -> Mixed '[Flatten' 1 sh] (Primitive a)
forall a (sh :: [Maybe Nat]).
Elt a =>
Mixed sh a -> Mixed '[Flatten sh] a
mflatten (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive Mixed sh a
a)))
                     (Mixed '[Flatten' 1 sh] (Primitive a) -> Mixed '[Flatten' 1 sh] a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive a) -> Mixed '[Flatten' 1 sh] (Primitive a)
forall a (sh :: [Maybe Nat]).
Elt a =>
Mixed sh a -> Mixed '[Flatten sh] a
mflatten (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive Mixed sh a
b)))

mtoXArrayPrimP :: Mixed sh (Primitive a) -> (IShX sh, XArray sh a)
mtoXArrayPrimP :: forall (sh :: [Maybe Nat]) a.
Mixed sh (Primitive a) -> (IShX sh, XArray sh a)
mtoXArrayPrimP (M_Primitive IShX sh
sh XArray sh a
arr) = (IShX sh
sh, XArray sh a
arr)

mtoXArrayPrim :: PrimElt a => Mixed sh a -> (IShX sh, XArray sh a)
mtoXArrayPrim :: forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> (IShX sh, XArray sh a)
mtoXArrayPrim = Mixed sh (Primitive a) -> (IShX sh, XArray sh a)
forall (sh :: [Maybe Nat]) a.
Mixed sh (Primitive a) -> (IShX sh, XArray sh a)
mtoXArrayPrimP (Mixed sh (Primitive a) -> (IShX sh, XArray sh a))
-> (Mixed sh a -> Mixed sh (Primitive a))
-> Mixed sh a
-> (IShX sh, XArray sh a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive

mfromXArrayPrimP :: StaticShX sh -> XArray sh a -> Mixed sh (Primitive a)
mfromXArrayPrimP :: forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> Mixed sh (Primitive a)
mfromXArrayPrimP StaticShX sh
ssh XArray sh a
arr = IShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive (StaticShX sh -> XArray sh a -> IShX sh
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> IShX sh
X.shape StaticShX sh
ssh XArray sh a
arr) XArray sh a
arr

mfromXArrayPrim :: PrimElt a => StaticShX sh -> XArray sh a -> Mixed sh a
mfromXArrayPrim :: forall a (sh :: [Maybe Nat]).
PrimElt a =>
StaticShX sh -> XArray sh a -> Mixed sh a
mfromXArrayPrim = (Mixed sh (Primitive a) -> Mixed sh a
forall (sh :: [Maybe Nat]). Mixed sh (Primitive a) -> Mixed sh a
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive a) -> Mixed sh a)
-> (XArray sh a -> Mixed sh (Primitive a))
-> XArray sh a
-> Mixed sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((XArray sh a -> Mixed sh (Primitive a))
 -> XArray sh a -> Mixed sh a)
-> (StaticShX sh -> XArray sh a -> Mixed sh (Primitive a))
-> StaticShX sh
-> XArray sh a
-> Mixed sh a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StaticShX sh -> XArray sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]) a.
StaticShX sh -> XArray sh a -> Mixed sh (Primitive a)
mfromXArrayPrimP

mliftPrim :: (PrimElt a, PrimElt b)
          => (a -> b)
          -> Mixed sh a -> Mixed sh b
mliftPrim :: forall a b (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b) =>
(a -> b) -> Mixed sh a -> Mixed sh b
mliftPrim a -> b
f (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh (X.XArray Array (Rank sh) a
arr)) = Mixed sh (Primitive b) -> Mixed sh b
forall (sh :: [Maybe Nat]). Mixed sh (Primitive b) -> Mixed sh b
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive b) -> Mixed sh b)
-> Mixed sh (Primitive b) -> Mixed sh b
forall a b. (a -> b) -> a -> b
$ IShX sh -> XArray sh b -> Mixed sh (Primitive b)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (Array (Rank sh) b -> XArray sh b
forall (sh :: [Maybe Nat]) a. Array (Rank sh) a -> XArray sh a
X.XArray ((a -> b) -> Array (Rank sh) a -> Array (Rank sh) b
forall a b (n :: Nat).
(Unbox a, Unbox b) =>
(a -> b) -> Array n a -> Array n b
S.mapA a -> b
f Array (Rank sh) a
arr))

mliftPrim2 :: (PrimElt a, PrimElt b, PrimElt c)
           => (a -> b -> c)
           -> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftPrim2 :: forall a b c (sh :: [Maybe Nat]).
(PrimElt a, PrimElt b, PrimElt c) =>
(a -> b -> c) -> Mixed sh a -> Mixed sh b -> Mixed sh c
mliftPrim2 a -> b -> c
f (Mixed sh a -> Mixed sh (Primitive a)
forall (sh :: [Maybe Nat]). Mixed sh a -> Mixed sh (Primitive a)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
sh (X.XArray Array (Rank sh) a
arr1)) (Mixed sh b -> Mixed sh (Primitive b)
forall (sh :: [Maybe Nat]). Mixed sh b -> Mixed sh (Primitive b)
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh a -> Mixed sh (Primitive a)
toPrimitive -> M_Primitive IShX sh
_ (X.XArray Array (Rank sh) b
arr2)) =
  Mixed sh (Primitive c) -> Mixed sh c
forall (sh :: [Maybe Nat]). Mixed sh (Primitive c) -> Mixed sh c
forall a (sh :: [Maybe Nat]).
PrimElt a =>
Mixed sh (Primitive a) -> Mixed sh a
fromPrimitive (Mixed sh (Primitive c) -> Mixed sh c)
-> Mixed sh (Primitive c) -> Mixed sh c
forall a b. (a -> b) -> a -> b
$ IShX sh -> XArray sh c -> Mixed sh (Primitive c)
forall (sh :: [Maybe Nat]) a.
IShX sh -> XArray sh a -> Mixed sh (Primitive a)
M_Primitive IShX sh
sh (Array (Rank sh) c -> XArray sh c
forall (sh :: [Maybe Nat]) a. Array (Rank sh) a -> XArray sh a
X.XArray ((a -> b -> c)
-> Array (Rank sh) a -> Array (Rank sh) b -> Array (Rank sh) c
forall a b c (n :: Nat).
(Unbox a, Unbox b, Unbox c) =>
(a -> b -> c) -> Array n a -> Array n b -> Array n c
S.zipWithA a -> b -> c
f Array (Rank sh) a
arr1 Array (Rank sh) b
arr2))