packages feed

knead 0.2.1 → 0.2.2

raw patch · 2 files changed

+73/−14 lines, 2 files

Files

knead.cabal view
@@ -1,5 +1,5 @@ Name:             knead-Version:          0.2.1+Version:          0.2.2 License:          BSD3 License-File:     LICENSE Author:           Henning Thielemann <haskell@henning-thielemann.de>@@ -47,7 +47,7 @@ Build-Type:       Simple  Source-Repository this-  Tag:         0.2.1+  Tag:         0.2.2   Type:        darcs   Location:    http://hub.darcs.net/thielema/knead/ 
src/Data/Array/Knead/Expression.hs view
@@ -10,11 +10,15 @@ import LLVM.Extra.Multi.Value (PatternTuple, Decomposed, Atom, atom, )  import qualified Control.Monad as Monad-import qualified Data.Tuple.HT as Tuple -import Prelude hiding (fst, snd, min, max, zip, unzip, zip3, unzip3, )+import qualified Data.Tuple.HT as TupleHT+import qualified Data.Tuple as Tuple+import Data.Complex (Complex((:+))) +import Prelude+   hiding (fst, snd, min, max, zip, unzip, zip3, unzip3, curry, uncurry, pi) + newtype Exp a = Exp {unExp :: forall r. LLVM.CodeGenFunction r (MultiValue.T a)}  @@ -122,6 +126,7 @@     lift1 (\(MultiValue.Cons (_,_,c,_)) -> MultiValue.Cons c) abcd,     lift1 (\(MultiValue.Cons (_,_,_,d)) -> MultiValue.Cons d) abcd) + fst :: (Value val) => val (a, b) -> val a fst = lift1 MultiValue.fst @@ -129,15 +134,40 @@ snd = lift1 MultiValue.snd  mapFst :: (Exp a -> Exp b) -> Exp (a, c) -> Exp (b, c)-mapFst f = modify (atom, atom) $ \(a,c) -> (f a, c)+mapFst f = modify (atom, atom) $ TupleHT.mapFst f  mapSnd :: (Exp b -> Exp c) -> Exp (a, b) -> Exp (a, c)-mapSnd f = modify (atom, atom) $ \(a,b) -> (a, f b)+mapSnd f = modify (atom, atom) $ TupleHT.mapSnd f  swap :: (Value val) => val (a, b) -> val (b, a) swap = lift1 MultiValue.swap +curry :: (Exp (a,b) -> c) -> (Exp a -> Exp b -> c)+curry f = Tuple.curry (f . Tuple.uncurry zip) +uncurry :: (Exp a -> Exp b -> c) -> (Exp (a,b) -> c)+uncurry f = Tuple.uncurry f . unzip+++fst3 :: (Value val) => val (a,b,c) -> val a+fst3 = lift1 MultiValue.fst3++snd3 :: (Value val) => val (a,b,c) -> val b+snd3 = lift1 MultiValue.snd3++thd3 :: (Value val) => val (a,b,c) -> val c+thd3 = lift1 MultiValue.thd3++mapFst3 :: (Exp a0 -> Exp a1) -> Exp (a0,b,c) -> Exp (a1,b,c)+mapFst3 f = modify (atom, atom, atom) $ TupleHT.mapFst3 f++mapSnd3 :: (Exp b0 -> Exp b1) -> Exp (a,b0,c) -> Exp (a,b1,c)+mapSnd3 f = modify (atom, atom, atom) $ TupleHT.mapSnd3 f++mapThd3 :: (Exp c0 -> Exp c1) -> Exp (a,b,c0) -> Exp (a,b,c1)+mapThd3 f = modify (atom, atom, atom) $ TupleHT.mapThd3 f++ modifyMultiValue ::    (Value val,     MultiValue.Compose a,@@ -236,7 +266,7 @@  instance Compose () where    type Composed () = ()-   compose = lift0 . MultiValue.cons+   compose = cons  instance Decompose () where    decompose _ _ = ()@@ -244,22 +274,22 @@  instance (Compose a, Compose b) => Compose (a,b) where    type Composed (a,b) = (Composed a, Composed b)-   compose = uncurry zip . Tuple.mapPair (compose, compose)+   compose = Tuple.uncurry zip . TupleHT.mapPair (compose, compose)  instance (Decompose pa, Decompose pb) => Decompose (pa,pb) where    decompose (pa,pb) =-      Tuple.mapPair (decompose pa, decompose pb) . unzip+      TupleHT.mapPair (decompose pa, decompose pb) . unzip   instance (Compose a, Compose b, Compose c) => Compose (a,b,c) where    type Composed (a,b,c) = (Composed a, Composed b, Composed c)-   compose = Tuple.uncurry3 zip3 . Tuple.mapTriple (compose, compose, compose)+   compose = TupleHT.uncurry3 zip3 . TupleHT.mapTriple (compose, compose, compose)  instance    (Decompose pa, Decompose pb, Decompose pc) =>       Decompose (pa,pb,pc) where    decompose (pa,pb,pc) =-      Tuple.mapTriple (decompose pa, decompose pb, decompose pc) . unzip3+      TupleHT.mapTriple (decompose pa, decompose pb, decompose pc) . unzip3   instance (Compose a, Compose b, Compose c, Compose d) => Compose (a,b,c,d) where@@ -275,8 +305,37 @@             (decompose pa a, decompose pb b, decompose pc c, decompose pd d)  +instance (Compose a) => Compose (Complex a) where+   type Composed (Complex a) = Complex (Composed a)+   compose (r:+i) = consComplex (compose r) (compose i)++instance (Decompose p) => Decompose (Complex p) where+   decompose (pr:+pi) =+      Tuple.uncurry (:+) .+      TupleHT.mapPair (decompose pr, decompose pi) . deconsComplex++{- |+You can construct complex numbers this way,+but they will not make you happy,+because the numeric operations require a RealFloat instance+that we could only provide with lots of undefined methods+(also in its superclasses).+You may either define your own arithmetic+or use the NumericPrelude type classes.+-}+consComplex :: Exp a -> Exp a -> Exp (Complex a)+consComplex = lift2 MultiValue.consComplex++deconsComplex :: Exp (Complex a) -> (Exp a, Exp a)+deconsComplex c = (lift1 MultiValue.realPart c, lift1 MultiValue.imagPart c)++++cons :: (MultiValue.C a) => a -> Exp a+cons = lift0 . MultiValue.cons+ unit :: Exp ()-unit = lift0 $ MultiValue.cons ()+unit = cons ()  zero :: (MultiValue.C a) => Exp a zero = lift0 MultiValue.zero@@ -327,8 +386,8 @@   true, false :: Exp Bool-true = lift0 $ MultiValue.cons True-false = lift0 $ MultiValue.cons False+true = cons True+false = cons False  infixr 3 &&* (&&*) :: Exp Bool -> Exp Bool -> Exp Bool