{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternSynonyms #-}
module Data.Poly.Sparse.Laurent
( Laurent
, VLaurent
, ULaurent
, unLaurent
, toLaurent
, leading
, monomial
, scale
, pattern X
, (^-)
, eval
, subst
, deriv
) where
import Data.Euclidean (Field)
import Data.Semiring (Semiring(..), Ring)
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Unboxed.Sized as SU
import qualified Data.Vector.Sized as SV
import Data.Poly.Internal.Multi.Laurent hiding (monomial, scale, pattern X, (^-), eval, subst, deriv)
import qualified Data.Poly.Internal.Multi.Laurent as Multi
import Data.Poly.Internal.Multi (Poly)
monomial
:: (Eq a, Semiring a, G.Vector v (SU.Vector 1 Word, a))
=> Int
-> a
-> Laurent v a
monomial = Multi.monomial . SU.singleton
scale
:: (Eq a, Semiring a, G.Vector v (SU.Vector 1 Word, a))
=> Int
-> a
-> Laurent v a
-> Laurent v a
scale = Multi.scale . SU.singleton
pattern X
:: (Eq a, Semiring a, G.Vector v (SU.Vector 1 Word, a))
=> Laurent v a
pattern X = Multi.X
(^-)
:: (Eq a, Semiring a, G.Vector v (SU.Vector 1 Word, a))
=> Laurent v a
-> Int
-> Laurent v a
(^-) = (Multi.^-)
eval
:: (Field a, G.Vector v (SU.Vector 1 Word, a))
=> Laurent v a
-> a
-> a
eval p = Multi.eval p . SV.singleton
subst
:: (Eq a, Semiring a, G.Vector v (SU.Vector 1 Word, a), G.Vector w (SU.Vector 1 Word, a))
=> Poly v a
-> Laurent w a
-> Laurent w a
subst p = Multi.subst p . SV.singleton
deriv
:: (Eq a, Ring a, G.Vector v (SU.Vector 1 Word, a))
=> Laurent v a
-> Laurent v a
deriv = Multi.deriv 0