module DDF.UnLiftEnv where
import DDF.Lang
import qualified DDF.Map as Map
import qualified DDF.VectorTF as VTF
newtype UnLiftEnv r h x = UnLiftEnv {runUnLiftEnv :: r () (h -> x)}
unLiftEnv = UnLiftEnv . const1
instance Prod r => DBI (UnLiftEnv r) where
z = UnLiftEnv zro
s (UnLiftEnv x) = UnLiftEnv $ x `com2` fst
abs (UnLiftEnv x) = UnLiftEnv $ curry1 $ x `com2` swap
app (UnLiftEnv f) (UnLiftEnv x) = UnLiftEnv $ scomb2 f x
instance Dual r => Dual (UnLiftEnv r) where
dual = unLiftEnv dual
runDual = unLiftEnv runDual
instance (Prod r, Float r) => Float (UnLiftEnv r) where
float = unLiftEnv . float
floatPlus = unLiftEnv floatPlus
floatMinus = unLiftEnv floatMinus
floatMult = unLiftEnv floatMult
floatDivide = unLiftEnv floatDivide
floatExp = unLiftEnv floatExp
instance (Prod r, Double r) => Double (UnLiftEnv r) where
double = unLiftEnv . double
doublePlus = unLiftEnv doublePlus
doubleMinus = unLiftEnv doubleMinus
doubleMult = unLiftEnv doubleMult
doubleDivide = unLiftEnv doubleDivide
doubleExp = unLiftEnv doubleExp
doubleEq = unLiftEnv doubleEq
instance (Prod r, Char r) => Char (UnLiftEnv r) where
char = unLiftEnv . char
instance (Prod r, Bool r) => Bool (UnLiftEnv r) where
bool = unLiftEnv . bool
ite = unLiftEnv ite
instance Prod r => Prod (UnLiftEnv r) where
mkProd = unLiftEnv mkProd
zro = unLiftEnv zro
fst = unLiftEnv fst
instance (Prod r, Unit r) => Unit (UnLiftEnv r) where
unit = unLiftEnv unit
instance (Prod r, Option r) => Option (UnLiftEnv r) where
nothing = unLiftEnv nothing
just = unLiftEnv just
optionMatch = unLiftEnv optionMatch
instance Map.Map r => Map.Map (UnLiftEnv r) where
empty = unLiftEnv Map.empty
singleton = unLiftEnv Map.singleton
lookup = unLiftEnv Map.lookup
alter = unLiftEnv Map.alter
mapMap = unLiftEnv Map.mapMap
unionWith = unLiftEnv Map.unionWith
instance Bimap r => Bimap (UnLiftEnv r) where
size = unLiftEnv size
insert = unLiftEnv insert
lookupL = unLiftEnv lookupL
lookupR = unLiftEnv lookupR
empty = unLiftEnv empty
singleton = unLiftEnv singleton
toMapL = unLiftEnv toMapL
toMapR = unLiftEnv toMapR
updateL = unLiftEnv updateL
updateR = unLiftEnv updateR
instance (Prod r, Sum r) => Sum (UnLiftEnv r) where
left = unLiftEnv left
right = unLiftEnv right
sumMatch = unLiftEnv sumMatch
instance (Prod r, Int r) => Int (UnLiftEnv r) where
int = unLiftEnv . int
isZero = unLiftEnv isZero
pred = unLiftEnv pred
instance (Prod r, Y r) => Y (UnLiftEnv r) where
y = unLiftEnv y
instance (Prod r, IO r) => IO (UnLiftEnv r) where
putStrLn = unLiftEnv putStrLn
instance (Unit r, Prod r, List r) => List (UnLiftEnv r) where
nil = unLiftEnv nil
cons = unLiftEnv cons
listMatch = unLiftEnv listMatch
instance (Prod r, Functor r m) => Functor (UnLiftEnv r) m where
map = unLiftEnv map
instance (Prod r, Applicative r m) => Applicative (UnLiftEnv r) m where
pure = unLiftEnv pure
ap = unLiftEnv ap
instance (Prod r, Monad r m) => Monad (UnLiftEnv r) m where
bind = unLiftEnv bind
join = unLiftEnv join
instance (Prod r, VTF.VectorTF r) => VTF.VectorTF (UnLiftEnv r) where
zero = unLiftEnv VTF.zero
basis = unLiftEnv VTF.basis
plus = unLiftEnv VTF.plus
mult = unLiftEnv VTF.mult
vtfMatch = unLiftEnv VTF.vtfMatch
instance (Prod r, DiffWrapper r) => DiffWrapper (UnLiftEnv r) where
diffWrapper = unLiftEnv diffWrapper
runDiffWrapper = unLiftEnv runDiffWrapper
instance (Prod r, Fix r) => Fix (UnLiftEnv r) where
fix = unLiftEnv fix
runFix = unLiftEnv runFix
instance (Prod r, FreeVector r) => FreeVector (UnLiftEnv r) where
freeVector = unLiftEnv freeVector
runFreeVector = unLiftEnv runFreeVector
instance Lang r => Lang (UnLiftEnv r) where
exfalso = unLiftEnv exfalso
writer = unLiftEnv writer
runWriter = unLiftEnv runWriter
state = unLiftEnv state
runState = unLiftEnv runState
float2Double = unLiftEnv float2Double
double2Float = unLiftEnv double2Float