packages feed

downhill-0.1.0.0: src/Downhill/BVar/Prelude.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ViewPatterns #-}

module Downhill.BVar.Prelude
  ( -- * Tuples

    -- | Pattern synonyms @T2@, @T3@ pack and unpack tuples:
    --
    -- @
    -- fstBVar :: (HasGrad a, HasGrad b) => BVar r (a, b) -> BVar r a
    -- fstBVar (T2 a _b) = a
    --
    -- tieBVar :: (HasGrad a, HasGrad b) => BVar r a -> BVar r b -> BVar r (a, b)
    -- tieBVar a b = T2 a b
    -- @
    pattern T2,
    pattern T3,
  )
where

import Downhill.BVar (BVar (BVar))
import Downhill.Grad (HasGrad)
import qualified Downhill.Linear.Prelude as Linear
import Prelude ()

toPair :: (HasGrad a, HasGrad b) => BVar r (a, b) -> (BVar r a, BVar r b)
toPair (BVar (x, y) (Linear.T2 dx dy)) = (BVar x dx, BVar y dy)

{-# COMPLETE T2 #-}

pattern T2 :: (HasGrad a, HasGrad b) => BVar r a -> BVar r b -> BVar r (a, b)
pattern T2 a b <-
  (toPair -> (a, b))
  where
    T2 (BVar a da) (BVar b db) = BVar (a, b) (Linear.T2 da db)

toTriple :: (HasGrad a, HasGrad b, HasGrad c) => BVar r (a, b, c) -> (BVar r a, BVar r b, BVar r c)
toTriple (BVar (x, y, z) (Linear.T3 dx dy dz)) = (BVar x dx, BVar y dy, BVar z dz)

{-# COMPLETE T3 #-}

pattern T3 :: (HasGrad a, HasGrad b, HasGrad c) => BVar r a -> BVar r b -> BVar r c -> BVar r (a, b, c)
pattern T3 a b c <-
  (toTriple -> (a, b, c))
  where
    T3 (BVar a da) (BVar b db) (BVar c dc) = BVar (a, b, c) (Linear.T3 da db dc)