packages feed

dynobud-1.9.0.0: src/Dyno/View/FunJac.hs

{-# OPTIONS_GHC -Wall #-}

module Dyno.View.FunJac
       ( JacIn(..)
       , JacOut(..)
       , Jac(..)
       ) where

import Data.Proxy
import qualified Data.Vector as V

import Dyno.View.View
import Dyno.View.Scheme
import Dyno.View.M

data JacIn xj x a = JacIn (J xj a) (x a)
data JacOut fj f a = JacOut (J fj a) (f a)
data Jac xj fj f a = Jac (M fj xj a) (J fj a) (f a)

instance (View xj, Scheme x) => Scheme (JacIn xj x) where
  numFields = (1+) . numFields . reproxy
    where
      reproxy :: Proxy (JacIn xj x) -> Proxy x
      reproxy = const Proxy
  fromVector v = JacIn j0 (fromVector (V.tail v))
    where
      j0 = case fromFioMat (V.head v) of
        Left err -> error $ "JacIn fromVector error: " ++ err
        Right j0' -> j0'

  toVector (JacIn xj x) = V.cons (toFioMat xj) (toVector x)
  sizeList p = fioMatSizes (reproxy' p) : sizeList (reproxy p)
    where
      reproxy :: Proxy (JacIn xj x) -> Proxy x
      reproxy = const Proxy
      reproxy' :: Proxy (JacIn xj x) -> Proxy (J xj)
      reproxy' = const Proxy

instance (View fj, Scheme f) => Scheme (JacOut fj f) where
  numFields = (1+) . numFields . reproxy
    where
      reproxy :: Proxy (JacOut fj f) -> Proxy f
      reproxy = const Proxy
  fromVector v = JacOut j0 (fromVector (V.tail v))
    where
      j0 = case fromFioMat (V.head v) of
        Left err -> error $ "JacOut fromVector error: " ++ err
        Right j0' -> j0'

  toVector (JacOut fj f) = V.cons (toFioMat fj) (toVector f)
  sizeList p = fioMatSizes (reproxy' p) : sizeList (reproxy p)
    where
      reproxy :: Proxy (JacOut fj f) -> Proxy f
      reproxy = const Proxy
      reproxy' :: Proxy (JacOut fj f) -> Proxy (J fj)
      reproxy' = const Proxy


instance (View xj, View fj, Scheme f) => Scheme (Jac xj fj f) where
  numFields = (2+) . numFields . reproxy
    where
      reproxy :: Proxy (Jac xj fj f) -> Proxy f
      reproxy = const Proxy
  fromVector v = Jac m fj (fromVector (V.drop 2 v))
    where
      m = case fromFioMat (v V.! 0) of
        Left err -> error $ "Jac fromVector error: " ++ err
        Right j0' -> j0'
      fj = case fromFioMat (v V.! 1) of
        Left err -> error $ "Jac fromVector error: " ++ err
        Right j0' -> j0'
  toVector (Jac m fj f) = V.fromList [toFioMat m, toFioMat fj] V.++ toVector f
  sizeList p = fioMatSizes (reproxy'' p) : fioMatSizes (reproxy' p) : sizeList (reproxy p)
    where
      reproxy'' :: Proxy (Jac xj fj f) -> Proxy (M fj xj)
      reproxy'' = const Proxy

      reproxy' :: Proxy (Jac xj fj f) -> Proxy (J fj)
      reproxy' = const Proxy

      reproxy :: Proxy (Jac xj fj f) -> Proxy f
      reproxy = const Proxy