{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Copilot.Language.Operators.Array
( (!)
, (!!)
, (=:)
, (=$)
) where
import Copilot.Core (Array, Op2 (Index),
Op3 (UpdateArray), Typed, typeOf)
import Copilot.Language.Operators.Projection (Projectable(..))
import Copilot.Language.Stream (Stream (..))
import Data.Word (Word32)
import GHC.TypeLits (KnownNat)
import Prelude hiding ((!!))
(!) :: (KnownNat n, Typed t)
=> Stream (Array n t) -> Stream Word32 -> Stream t
Stream (Array n t)
arr ! :: forall (n :: Nat) t.
(KnownNat n, Typed t) =>
Stream (Array n t) -> Stream Word32 -> Stream t
! Stream Word32
n = Op2 (Array n t) Word32 t
-> Stream (Array n t) -> Stream Word32 -> Stream t
forall a1 b a.
(Typed a1, Typed b, Typed a) =>
Op2 a1 b a -> Stream a1 -> Stream b -> Stream a
Op2 (Type (Array n t) -> Op2 (Array n t) Word32 t
forall (n :: Nat) c. Type (Array n c) -> Op2 (Array n c) Word32 c
Index Type (Array n t)
forall a. Typed a => Type a
typeOf) Stream (Array n t)
arr Stream Word32
n
(!!) :: Stream (Array n t)
-> Stream Word32
-> Projection (Array n t) (Stream Word32) t
!! :: forall (n :: Nat) t.
Stream (Array n t)
-> Stream Word32 -> Projection (Array n t) (Stream Word32) t
(!!) = Stream (Array n t)
-> Stream Word32 -> Projection (Array n t) (Stream Word32) t
forall (n :: Nat) t.
Stream (Array n t)
-> Stream Word32 -> Projection (Array n t) (Stream Word32) t
ProjectionA
instance (KnownNat n, Typed t) => Projectable (Array n t) (Stream Word32) t where
data Projection (Array n t) (Stream Word32) t =
ProjectionA (Stream (Array n t)) (Stream Word32)
=: :: Projection (Array n t) (Stream Word32) t
-> Stream t -> Stream (Array n t)
(=:) (ProjectionA Stream (Array n t)
s Stream Word32
ix) Stream t
v = Op3 (Array n t) Word32 t (Array n t)
-> Stream (Array n t)
-> Stream Word32
-> Stream t
-> Stream (Array n t)
forall a1 b c a.
(Typed a1, Typed b, Typed c, Typed a) =>
Op3 a1 b c a -> Stream a1 -> Stream b -> Stream c -> Stream a
Op3 (Type (Array n t) -> Op3 (Array n t) Word32 t (Array n t)
forall (n :: Nat) c.
Type (Array n c) -> Op3 (Array n c) Word32 c (Array n c)
UpdateArray Type (Array n t)
forall a. Typed a => Type a
typeOf) Stream (Array n t)
s Stream Word32
ix Stream t
v
=$ :: Projection (Array n t) (Stream Word32) t
-> (Stream t -> Stream t) -> Stream (Array n t)
(=$) (ProjectionA Stream (Array n t)
s Stream Word32
ix) Stream t -> Stream t
op = Op3 (Array n t) Word32 t (Array n t)
-> Stream (Array n t)
-> Stream Word32
-> Stream t
-> Stream (Array n t)
forall a1 b c a.
(Typed a1, Typed b, Typed c, Typed a) =>
Op3 a1 b c a -> Stream a1 -> Stream b -> Stream c -> Stream a
Op3 (Type (Array n t) -> Op3 (Array n t) Word32 t (Array n t)
forall (n :: Nat) c.
Type (Array n c) -> Op3 (Array n c) Word32 c (Array n c)
UpdateArray Type (Array n t)
forall a. Typed a => Type a
typeOf) Stream (Array n t)
s Stream Word32
ix (Stream t -> Stream t
op (Stream (Array n t)
s Stream (Array n t) -> Stream Word32 -> Stream t
forall (n :: Nat) t.
(KnownNat n, Typed t) =>
Stream (Array n t) -> Stream Word32 -> Stream t
! Stream Word32
ix))