module UniqueLogic.ST.Example.Rule
{-# DEPRECATED "This module is intended for documentation purposes. Do not import it!" #-}
 where

import qualified UniqueLogic.ST.Rule as Rule
import qualified UniqueLogic.ST.System.Simple as Sys

import Control.Monad.ST (runST, )
import Control.Monad (liftM4, )

import qualified Prelude as P
import Prelude hiding (max)


{- |
> x=1
> y=2
> z=3
> w=3

> x+y=3
> y*z=6
> z=3
> y^w=8
-}
example :: (Maybe Double, Maybe Double, Maybe Double, Maybe Double)
example :: (Maybe Double, Maybe Double, Maybe Double, Maybe Double)
example =
   forall a. (forall s. ST s a) -> a
runST (do
      Variable s Double
x <- forall s a. ST s (Variable s a)
Sys.globalVariable
      Variable s Double
y <- forall s a. ST s (Variable s a)
Sys.globalVariable
      Variable s Double
z <- forall s a. ST s (Variable s a)
Sys.globalVariable
      Variable s Double
w <- forall s a. ST s (Variable s a)
Sys.globalVariable
      forall s a. T s a -> ST s a
Sys.solve forall a b. (a -> b) -> a -> b
$ do
         Variable s Double
c3 <- forall a s. a -> T s (Variable s a)
Sys.constant Double
3
         Variable s Double
c6 <- forall a s. a -> T s (Variable s a)
Sys.constant Double
6
         Variable s Double
c8 <- forall a s. a -> T s (Variable s a)
Sys.constant Double
8
         forall a (w :: (* -> *) -> * -> *) s.
(Num a, C w) =>
Variable w s a -> Variable w s a -> Variable w s a -> T w s ()
Rule.add Variable s Double
x Variable s Double
y Variable s Double
c3
         forall a (w :: (* -> *) -> * -> *) s.
(Fractional a, C w) =>
Variable w s a -> Variable w s a -> Variable w s a -> T w s ()
Rule.mul Variable s Double
y Variable s Double
z Variable s Double
c6
         forall (w :: (* -> *) -> * -> *) s a.
C w =>
Variable w s a -> Variable w s a -> T w s ()
Rule.equ Variable s Double
z Variable s Double
c3
         forall a (w :: (* -> *) -> * -> *) s.
(Floating a, C w) =>
Variable w s a -> Variable w s a -> Variable w s a -> T w s ()
Rule.pow Variable s Double
y Variable s Double
w Variable s Double
c8
      forall (m :: * -> *) a1 a2 a3 a4 r.
Monad m =>
(a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4
         (,,,)
         (forall s a. Variable s a -> ST s (Maybe a)
Sys.query Variable s Double
x)
         (forall s a. Variable s a -> ST s (Maybe a)
Sys.query Variable s Double
y)
         (forall s a. Variable s a -> ST s (Maybe a)
Sys.query Variable s Double
z)
         (forall s a. Variable s a -> ST s (Maybe a)
Sys.query Variable s Double
w))