diff --git a/.gitignore b/.gitignore
index ff05b193..0a99d2db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,7 +24,7 @@ cabal.project.local~
.ghc.environment.*
# Others
-tests/testAFRPMain
+yampa/tests/testAFRPMain
.virthualenv
SourceGraph
.tags
diff --git a/.travis.yml b/.travis.yml
index af93abdf..0e1077e0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,10 +19,10 @@ before_install:
- travis_retry sudo apt-get install libcwiid-dev libsdl1.2-dev
install:
- - travis_retry cabal install --enable-tests -fexamples --only-dependencies . extensions/testing/
+ - travis_retry cabal install --enable-tests -fexamples --only-dependencies yampa/ yampa-test/
script:
- - if [ "${TRAVIS_HASKELL_VERSION}" == "8.4.4" ]; then cabal install -ftest-doc-coverage --run-tests -j1 . extensions/testing/; else cabal install --enable-tests -fexamples -j1 . extensions/testing/; fi
+ - if [ "${TRAVIS_HASKELL_VERSION}" == "8.4.4" ]; then cabal install -ftest-doc-coverage --run-tests -j1 yampa/ yampa-test/; else cabal install --enable-tests -fexamples -j1 yampa/ yampa-test/; fi
after_script:
diff --git a/README.md b/README.md
deleted file mode 100644
index d29a8bda..00000000
--- a/README.md
+++ /dev/null
@@ -1,233 +0,0 @@
-# Yampa
-
-[![Build Status](https://travis-ci.org/ivanperez-keera/Yampa.svg?branch=master)](https://travis-ci.org/ivanperez-keera/Yampa)
-[![Version on Hackage](https://img.shields.io/hackage/v/Yampa.svg)](https://hackage.haskell.org/package/Yampa)
-[![Flattr this](http://api.flattr.com/button/flattr-badge-large.png "Flattr This!")](https://flattr.com/submit/auto?user_id=ivanperez-keera&url=https://github.com/ivanperez-keera/Yampa&title=Yampa&language=&tags=github&category=software)
-
-Domain-specific language embedded in Haskell for programming hybrid (mixed
-discrete-time and continuous-time) systems. Yampa is based on the concepts of
-Functional Reactive Programming (FRP) and is structured using arrow
-combinators.
-
-## Installation
-
-Yampa is available on hackage: http://hackage.haskell.org/package/Yampa.
-
-```
-$ cabal sandbox init # Optional. Useful to isolate projects.
-$ cabal update
-$ cabal install Yampa
-```
-
-## Examples
-
-Getting Yampa to run is trivial. FRP is about values that change over time. In
-Yampa, a system is defined by a signal function (SF), which determines how the
-varying input and the varying output relate. For example:
-
-```haskell
-{-# LANGUAGE Arrows #-}
-import FRP.Yampa
-
-signalFunction :: SF Double Double
-signalFunction = proc x -> do
- y <- integral -< x
- t <- time -< ()
- returnA -< y / t
-```
-
-This signal function says that the output signal is the integral `y` of the
-input signal `x`, divided by the time `t`. The above syntax uses a Haskell
-extension called Arrows. If you are unhappy using arrow syntax, you can also
-write that code using applicative style and/or arrow combinators:
-
-```haskell
-signalFunction1 :: SF Double Double
-signalFunction1 = (/) <$> integral <*> time
-
-signalFunction2 :: SF Double Double
-signalFunction2 = (integral &&& time) >>^ (/)
-```
-
-All three are equivalent, and it's a matter of which one you like best. To run
-this example, we need to provide the inputs, the times, and consume the output:
-```haskell
-firstSample :: IO Double -- sample at time zero
-firstSample =
- return 1.0 -- time == 0, input == 1.0
-
-nextSamples :: Bool -> IO (Double, Maybe Double)
-nextSamples _ =
- return (0.1, Just 1.0) -- time delta == 0.1s, input == 1.0
-
-output :: Bool -> Double -> IO Bool
-output _ x = do
- print x -- print the output
- return False -- just continue forever
-```
-
-This is a trivial example, since the integral of the constant function 1.0 over
-time, divided by the time, is always 1.0! Nevertheless, we are now ready to
-run!
-
-```
-ghci> reactimate firstSample nextSamples output signalFunction
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-...
-```
-
-There is a directory with examples, which includes two basic SDL examples and
-one with using a Nintendo Wii Remote. You can install them with:
-
-```
-$ cabal sandbox init # Optional, but recommended
-$ cabal update
-$ cabal install Yampa -fexamples
-```
-
-There are many programs written in Yampa:
-
-* [Haskanoid](https://github.com/ivanperez-keera/haskanoid): a game that uses
- SDL multimedia, wiimote and kinect. It's cross platform and works in desktop,
- mobile, and [web](http://ivanperez-keera.github.io/haskanoid/haskanoid.jsexe/index.html)
- (compiled with [GHCJS](https://github.com/ghcjs/ghcjs)).
-* [Space invaders](https://hackage.haskell.org/package/SpaceInvaders).
-* [Frag](https://hackage.haskell.org/package/frag): a 3D first person shooting game.
-* [Peoplemon](https://linearity.itch.io/peoplemon): a role playing game.
-* [Yampa-2048](https://github.com/ksaveljev/yampa-2048): an implementation of
- the game 2048 using Yampa and Gloss.
-* [MandelbrotYampa](https://github.com/madjestic/Haskell-OpenGL-Tutorial/tree/master/MandelbrotYampa):
- a "hello world" using SDL2, Yampa and OpenGL.
-* [Haskelloids](https://github.com/keera-studios/Haskelloids): a reproduction of the Atari 1979 classic "Asteroids"
-
-A more comprehensive list can be obtained using the reverse dependency finder
-(http://packdeps.haskellers.com/reverse/Yampa), but only programs uploaded to
-hackage are listed.
-
-| | | |
-|-------------------------------------------|---------------|-------------------------|
-| Haskanoid, SDL cross-platform arkanoid. | Peoplemon, a role playing game | Yampa2048, a gloss board game |
-
-## Use in production
-
-* Keera Studios is using it for several Haskell games for Android and iOS
- including a game currently available on [iTunes](https://itunes.apple.com/us/app/magic-cookies/id1244709871) and [Google Play](https://play.google.com/store/apps/details?id=uk.co.keera.games.magiccookies). See:
- * http://facebook.com/keerastudios
- * https://itunes.apple.com/us/app/magic-cookies/id1244709871
- * https://play.google.com/store/apps/details?id=uk.co.keera.games.magiccookies
-
-## Backends
-
-Yampa is backend agnostic, you can ultimately connect it to any backend you
-want. Existing backends include:
-* SDL
-* SDL2
-* OpenGL / GLUT
-* WX (see wxHaskell)
-* HTML Canvas via JS Dom (for an example, see [haskanoid's GHCJS branch](https://github.com/ivanperez-keera/haskanoid/blob/ghcjs/src/Display.hs))
-* HTML5 Canvas via blank-canvas (see [yampa-canvas](https://github.com/ku-fpg/yampa-canvas))
-* Gloss (see [yampa-gloss](https://github.com/ivanperez-keera/yampa-gloss))
-* Diagrams (see [diagrams example](examples/Diagrams.hs))
-* [Keera Hails](https://github.com/keera-studios/keera-hails/tree/master/keera-hails-reactive-yampa) (reactive programming framework with GTK, WX, Qt, Android, iOS and HTML support).
-
-## Testing
-
-Yampa comes with a sophisticated testing library that allows you to use
-QuickCheck to test your games, and use a time-travel debugger. These features
-are described in the paper [Testing and Debugging Functional Reactive
-Programming](http://dl.acm.org/authorize?N46564).
-
-You can find the additional projects at:
-* [yampa-test](https://github.com/ivanperez-keera/Yampa/tree/develop/extensions/testing)
-* [Haskell Titan](https://github.com/keera-studios/haskell-titan)
-
-## Documentation and tutorials
-
-The distribution of Yampa comes with substantial haddock documentation, which you can
-build using haddock or just [read online](https://hackage.haskell.org/package/Yampa).
-To build a local copy, do:
-
-```
-$ cabal unpack Yampa ## Or git clone this-repo
-$ cd Yampa-*
-$ cabal init
-$ cabal install --only-dependencies
-$ cabal configure && cabal haddock --internal
-```
-
-Documentation is also available online: https://wiki.haskell.org/Yampa
-
-## Papers and technical reports
-
-* [Extensible and Robust Functional Reactive Programming](http://www.cs.nott.ac.uk/~psxip1/papers/2017-Perez-thesis-latest.pdf) (Ivan Perez; 2017)
-* [Testing and Debugging Functional Reactive Programming](http://dl.acm.org/authorize?N46564) (Ivan Perez and Henrik Nilsson; 2017)
-* [Functional Reactive Programming, Refactored](http://dl.acm.org/authorize?N34896) (Ivan Perez, Manuel Bärenz, and Henrik Nilsson; 2016)
-* [Safe Functional Reactive Programming through Dependent Types](http://dl.acm.org/authorize?N08595) (Neil Sculthorpe and Henrik Nilsson; 2009)
-* [Push-Pull Functional Reactive Programming](http://conal.net/papers/push-pull-frp/push-pull-frp.pdf) (Conal Elliott; 2009)
-* [Switched-on Yampa: Declarative Programming of Modular Synthesizers](http://www.cs.nott.ac.uk/~psznhn/Publications/padl2008.pdf) (George Giorgidze and Henrik Nilsson; 2008)
-* [Demo-outline: Switched-on Yampa: Programming Modular Synthesizers in Haskell](http://dl.acm.org/authorize?N08596) (George Giorgidze and Henrik Nilsson; 2007)
-* [Dynamic Optimization for Functional Reactive Programming using Generalized Algebraic Data Types](http://dl.acm.org/authorize?N08598) (Henrik Nilsson; 2005)
-* [The Yampa Arcade](http://dl.acm.org/authorize?N08599) (Antony Courtney, Henrik Nilsson, and John Peterson; 2003)
-* [Arrows, Robots, and Functional Reactive Programming](http://www.cs.nott.ac.uk/~psznhn/Publications/afp2002.pdf) (Paul Hudak, Antony Courtney, Henrik Nilsson, and John Peterson; 2002)
-* [Functional Reactive Programming, Continued](http://dl.acm.org/authorize?N08592) (Henrik Nilsson, Antony Courtney, and John Peterson; 2002)
-* [Genuinely Functional User Interfaces](http://conal.net/papers/genuinely-functional-guis.pdf) (Antony Courtney and Conal Elliott; 2001)
-
-
-* See also:
- * [Collection of Yampa diagrams](doc/diagrams/Diagrams.md)
- * [Henrik Nilsson's publications](http://www.cs.nott.ac.uk/~psznhn/papers.html)
- * [Ivan Perez's publications ](http://www.cs.nott.ac.uk/~psxip1/)
- * [First Year PhD Report](http://www.cs.nott.ac.uk/~psxip1/papers/2014-Perez-1st-year-report.pdf) (Ivan Perez, 2014), chapter 3 includes a review of FRP and outlines some existing issues.
-
-## Related projects
-
-* [yampa-sdl2](https://github.com/Simre1/yampa-sdl2): Yampa and SDL2 made easy.
-* [Haskell-OpenGL-Tutorial](https://github.com/madjestic/Haskell-OpenGL-Tutorial/tree/master/MandelbrotYampa) same as [here](https://github.com/ubuntunux/LambdaEngine3D/tree/master/MandelbrotYampa): Visually attractive mandelbrot implementation.
-* [graphui](https://github.com/sinelaw/graphui): Attempt to implement Graphui.
-* [hamball](https://github.com/harley/hamball): 3D, LAN FPS game of hamster balls flying around and shooting lasers written in Haskell.
-* [yampa-glfw](https://github.com/deepfire/yampa-glfw): GLFW backend.
-* [Spaceinvaders](https://github.com/ivanperez-keera/SpaceInvaders): Re-write of the classic space invaders.
-* [Haskanoid](https://github.com/ivanperez-keera/haskanoid): Arkanoid clone in SDL with wiimote and kinect support that works on windows, linux, Mac, Android, and Web.
-* [Magic Cookies](http://haskell.games): iOS/Android haskell puzzle game.
-* [Pang-a-lambda](https://hackage.haskell.org/package/pang-a-lambda): 2D arcade game inspired by the classic super-pang.
-* [yampa-canvas](https://github.com/ku-fpg/yampa-canvas): Backend to blank-canvas / HTML5 Canvas.
-* [yampa-gloss](https://github.com/ivanperez-keera/yampa-gloss): Gloss backend.
-* [diagrams example](examples/Diagrams.hs): Demonstration of Yampa with Diagrams.
-* [Keera Hails](https://github.com/keera-studios/keera-hails/tree/master/keera-hails-reactive-yampa): Backend for reactive framework with GTK, WX, Qt, Android, iOS and HTML support.
-* [YampaSynth](http://hackage.haskell.org/package/YampaSynth): Software synthesizer.
-* [Frag](https://wiki.haskell.org/Frag): 3D first person shooter.
-* [cuboid](http://hackage.haskell.org/package/cuboid): 3D puzzle game with GLUT.
-* [Haskelloids](http://hackage.haskell.org/package/Haskelloids): Reproduction of the Atari 1979 classic "Asteroids".
-* [YFrob](hackage.haskell.org/package/YFrob): Yampa-based library for programming robots.
-* [YampaShooter](https://github.com/werk/YampaShooter): Top-down team based networked tank game.
-* [LaneWars](https://github.com/Mattiemus/LaneWars): Top-down MOBA game with online multiplayer.
-* [Functional Reactive Virtual Reality](https://imve.informatik.uni-hamburg.de/projects/FRVR): a fork of Yampa with extensions for VR.
-* [Dunai](https://github.com/ivanperez-keera/dunai): An FRP implementation inspired by Yampa that extends SFs with a monad.
-* [Bearriver](https://github.com/ivanperez-keera/dunai/tree/develop/examples/bearriver): API-compatible Yampa replacement built on top of dunai using Monadic Stream Functions.
-* [The Bearriver Arcade](https://github.com/walseb/The_Bearriver_Arcade): A couple of arcade games made using bearriver.
-
-## Help and collaboration
-
-You can collaborate at least in three ways:
-
-* File an issue (https://github.com/ivanperez-keera/Yampa/issues).
-* Write documentation (send a link and/or a pull request).
-* Research: we are constantly trying to improve Yampa. We'd be glad to have
- collaborators. If you are working on this, please, let us know.
-
- (_Interactivity and FRP is the main topic of my (ongoing) work and research,
- so I'll keep working on this for some time._ -- Ivan Perez)
-
-## Authors
-
-* Henrik Nilsson
-* Antony Courtney
-
-### Maintainer
-
-* Ivan Perez
diff --git a/README.md b/README.md
new file mode 120000
index 00000000..85a781a4
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+yampa/README.md
\ No newline at end of file
diff --git a/cabal.project b/cabal.project
index a6645e78..12e92a5a 100644
--- a/cabal.project
+++ b/cabal.project
@@ -1,4 +1,4 @@
packages:
- ./.
- extensions/testing/
+ yampa/
+ yampa-test/
diff --git a/extensions/testing/CHANGELOG b/yampa-test/CHANGELOG
similarity index 100%
rename from extensions/testing/CHANGELOG
rename to yampa-test/CHANGELOG
diff --git a/extensions/testing/LICENSE b/yampa-test/LICENSE
similarity index 100%
rename from extensions/testing/LICENSE
rename to yampa-test/LICENSE
diff --git a/Setup.hs b/yampa-test/Setup.hs
similarity index 100%
rename from Setup.hs
rename to yampa-test/Setup.hs
diff --git a/extensions/testing/src/FRP/Yampa/Debug.hs b/yampa-test/src/FRP/Yampa/Debug.hs
similarity index 100%
rename from extensions/testing/src/FRP/Yampa/Debug.hs
rename to yampa-test/src/FRP/Yampa/Debug.hs
diff --git a/extensions/testing/src/FRP/Yampa/LTLFuture.hs b/yampa-test/src/FRP/Yampa/LTLFuture.hs
similarity index 100%
rename from extensions/testing/src/FRP/Yampa/LTLFuture.hs
rename to yampa-test/src/FRP/Yampa/LTLFuture.hs
diff --git a/extensions/testing/src/FRP/Yampa/LTLPast.hs b/yampa-test/src/FRP/Yampa/LTLPast.hs
similarity index 100%
rename from extensions/testing/src/FRP/Yampa/LTLPast.hs
rename to yampa-test/src/FRP/Yampa/LTLPast.hs
diff --git a/extensions/testing/src/FRP/Yampa/QuickCheck.hs b/yampa-test/src/FRP/Yampa/QuickCheck.hs
similarity index 100%
rename from extensions/testing/src/FRP/Yampa/QuickCheck.hs
rename to yampa-test/src/FRP/Yampa/QuickCheck.hs
diff --git a/extensions/testing/src/FRP/Yampa/Stream.hs b/yampa-test/src/FRP/Yampa/Stream.hs
similarity index 100%
rename from extensions/testing/src/FRP/Yampa/Stream.hs
rename to yampa-test/src/FRP/Yampa/Stream.hs
diff --git a/extensions/testing/tests/YampaQC.hs b/yampa-test/tests/YampaQC.hs
similarity index 100%
rename from extensions/testing/tests/YampaQC.hs
rename to yampa-test/tests/YampaQC.hs
diff --git a/extensions/testing/yampa-test.cabal b/yampa-test/yampa-test.cabal
similarity index 100%
rename from extensions/testing/yampa-test.cabal
rename to yampa-test/yampa-test.cabal
diff --git a/CHANGELOG b/yampa/CHANGELOG
similarity index 100%
rename from CHANGELOG
rename to yampa/CHANGELOG
diff --git a/HLint.hs b/yampa/HLint.hs
similarity index 100%
rename from HLint.hs
rename to yampa/HLint.hs
diff --git a/LICENSE b/yampa/LICENSE
similarity index 100%
rename from LICENSE
rename to yampa/LICENSE
diff --git a/yampa/README.md b/yampa/README.md
new file mode 100644
index 00000000..d29a8bda
--- /dev/null
+++ b/yampa/README.md
@@ -0,0 +1,233 @@
+# Yampa
+
+[![Build Status](https://travis-ci.org/ivanperez-keera/Yampa.svg?branch=master)](https://travis-ci.org/ivanperez-keera/Yampa)
+[![Version on Hackage](https://img.shields.io/hackage/v/Yampa.svg)](https://hackage.haskell.org/package/Yampa)
+[![Flattr this](http://api.flattr.com/button/flattr-badge-large.png "Flattr This!")](https://flattr.com/submit/auto?user_id=ivanperez-keera&url=https://github.com/ivanperez-keera/Yampa&title=Yampa&language=&tags=github&category=software)
+
+Domain-specific language embedded in Haskell for programming hybrid (mixed
+discrete-time and continuous-time) systems. Yampa is based on the concepts of
+Functional Reactive Programming (FRP) and is structured using arrow
+combinators.
+
+## Installation
+
+Yampa is available on hackage: http://hackage.haskell.org/package/Yampa.
+
+```
+$ cabal sandbox init # Optional. Useful to isolate projects.
+$ cabal update
+$ cabal install Yampa
+```
+
+## Examples
+
+Getting Yampa to run is trivial. FRP is about values that change over time. In
+Yampa, a system is defined by a signal function (SF), which determines how the
+varying input and the varying output relate. For example:
+
+```haskell
+{-# LANGUAGE Arrows #-}
+import FRP.Yampa
+
+signalFunction :: SF Double Double
+signalFunction = proc x -> do
+ y <- integral -< x
+ t <- time -< ()
+ returnA -< y / t
+```
+
+This signal function says that the output signal is the integral `y` of the
+input signal `x`, divided by the time `t`. The above syntax uses a Haskell
+extension called Arrows. If you are unhappy using arrow syntax, you can also
+write that code using applicative style and/or arrow combinators:
+
+```haskell
+signalFunction1 :: SF Double Double
+signalFunction1 = (/) <$> integral <*> time
+
+signalFunction2 :: SF Double Double
+signalFunction2 = (integral &&& time) >>^ (/)
+```
+
+All three are equivalent, and it's a matter of which one you like best. To run
+this example, we need to provide the inputs, the times, and consume the output:
+```haskell
+firstSample :: IO Double -- sample at time zero
+firstSample =
+ return 1.0 -- time == 0, input == 1.0
+
+nextSamples :: Bool -> IO (Double, Maybe Double)
+nextSamples _ =
+ return (0.1, Just 1.0) -- time delta == 0.1s, input == 1.0
+
+output :: Bool -> Double -> IO Bool
+output _ x = do
+ print x -- print the output
+ return False -- just continue forever
+```
+
+This is a trivial example, since the integral of the constant function 1.0 over
+time, divided by the time, is always 1.0! Nevertheless, we are now ready to
+run!
+
+```
+ghci> reactimate firstSample nextSamples output signalFunction
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+...
+```
+
+There is a directory with examples, which includes two basic SDL examples and
+one with using a Nintendo Wii Remote. You can install them with:
+
+```
+$ cabal sandbox init # Optional, but recommended
+$ cabal update
+$ cabal install Yampa -fexamples
+```
+
+There are many programs written in Yampa:
+
+* [Haskanoid](https://github.com/ivanperez-keera/haskanoid): a game that uses
+ SDL multimedia, wiimote and kinect. It's cross platform and works in desktop,
+ mobile, and [web](http://ivanperez-keera.github.io/haskanoid/haskanoid.jsexe/index.html)
+ (compiled with [GHCJS](https://github.com/ghcjs/ghcjs)).
+* [Space invaders](https://hackage.haskell.org/package/SpaceInvaders).
+* [Frag](https://hackage.haskell.org/package/frag): a 3D first person shooting game.
+* [Peoplemon](https://linearity.itch.io/peoplemon): a role playing game.
+* [Yampa-2048](https://github.com/ksaveljev/yampa-2048): an implementation of
+ the game 2048 using Yampa and Gloss.
+* [MandelbrotYampa](https://github.com/madjestic/Haskell-OpenGL-Tutorial/tree/master/MandelbrotYampa):
+ a "hello world" using SDL2, Yampa and OpenGL.
+* [Haskelloids](https://github.com/keera-studios/Haskelloids): a reproduction of the Atari 1979 classic "Asteroids"
+
+A more comprehensive list can be obtained using the reverse dependency finder
+(http://packdeps.haskellers.com/reverse/Yampa), but only programs uploaded to
+hackage are listed.
+
+| | | |
+|-------------------------------------------|---------------|-------------------------|
+| Haskanoid, SDL cross-platform arkanoid. | Peoplemon, a role playing game | Yampa2048, a gloss board game |
+
+## Use in production
+
+* Keera Studios is using it for several Haskell games for Android and iOS
+ including a game currently available on [iTunes](https://itunes.apple.com/us/app/magic-cookies/id1244709871) and [Google Play](https://play.google.com/store/apps/details?id=uk.co.keera.games.magiccookies). See:
+ * http://facebook.com/keerastudios
+ * https://itunes.apple.com/us/app/magic-cookies/id1244709871
+ * https://play.google.com/store/apps/details?id=uk.co.keera.games.magiccookies
+
+## Backends
+
+Yampa is backend agnostic, you can ultimately connect it to any backend you
+want. Existing backends include:
+* SDL
+* SDL2
+* OpenGL / GLUT
+* WX (see wxHaskell)
+* HTML Canvas via JS Dom (for an example, see [haskanoid's GHCJS branch](https://github.com/ivanperez-keera/haskanoid/blob/ghcjs/src/Display.hs))
+* HTML5 Canvas via blank-canvas (see [yampa-canvas](https://github.com/ku-fpg/yampa-canvas))
+* Gloss (see [yampa-gloss](https://github.com/ivanperez-keera/yampa-gloss))
+* Diagrams (see [diagrams example](examples/Diagrams.hs))
+* [Keera Hails](https://github.com/keera-studios/keera-hails/tree/master/keera-hails-reactive-yampa) (reactive programming framework with GTK, WX, Qt, Android, iOS and HTML support).
+
+## Testing
+
+Yampa comes with a sophisticated testing library that allows you to use
+QuickCheck to test your games, and use a time-travel debugger. These features
+are described in the paper [Testing and Debugging Functional Reactive
+Programming](http://dl.acm.org/authorize?N46564).
+
+You can find the additional projects at:
+* [yampa-test](https://github.com/ivanperez-keera/Yampa/tree/develop/extensions/testing)
+* [Haskell Titan](https://github.com/keera-studios/haskell-titan)
+
+## Documentation and tutorials
+
+The distribution of Yampa comes with substantial haddock documentation, which you can
+build using haddock or just [read online](https://hackage.haskell.org/package/Yampa).
+To build a local copy, do:
+
+```
+$ cabal unpack Yampa ## Or git clone this-repo
+$ cd Yampa-*
+$ cabal init
+$ cabal install --only-dependencies
+$ cabal configure && cabal haddock --internal
+```
+
+Documentation is also available online: https://wiki.haskell.org/Yampa
+
+## Papers and technical reports
+
+* [Extensible and Robust Functional Reactive Programming](http://www.cs.nott.ac.uk/~psxip1/papers/2017-Perez-thesis-latest.pdf) (Ivan Perez; 2017)
+* [Testing and Debugging Functional Reactive Programming](http://dl.acm.org/authorize?N46564) (Ivan Perez and Henrik Nilsson; 2017)
+* [Functional Reactive Programming, Refactored](http://dl.acm.org/authorize?N34896) (Ivan Perez, Manuel Bärenz, and Henrik Nilsson; 2016)
+* [Safe Functional Reactive Programming through Dependent Types](http://dl.acm.org/authorize?N08595) (Neil Sculthorpe and Henrik Nilsson; 2009)
+* [Push-Pull Functional Reactive Programming](http://conal.net/papers/push-pull-frp/push-pull-frp.pdf) (Conal Elliott; 2009)
+* [Switched-on Yampa: Declarative Programming of Modular Synthesizers](http://www.cs.nott.ac.uk/~psznhn/Publications/padl2008.pdf) (George Giorgidze and Henrik Nilsson; 2008)
+* [Demo-outline: Switched-on Yampa: Programming Modular Synthesizers in Haskell](http://dl.acm.org/authorize?N08596) (George Giorgidze and Henrik Nilsson; 2007)
+* [Dynamic Optimization for Functional Reactive Programming using Generalized Algebraic Data Types](http://dl.acm.org/authorize?N08598) (Henrik Nilsson; 2005)
+* [The Yampa Arcade](http://dl.acm.org/authorize?N08599) (Antony Courtney, Henrik Nilsson, and John Peterson; 2003)
+* [Arrows, Robots, and Functional Reactive Programming](http://www.cs.nott.ac.uk/~psznhn/Publications/afp2002.pdf) (Paul Hudak, Antony Courtney, Henrik Nilsson, and John Peterson; 2002)
+* [Functional Reactive Programming, Continued](http://dl.acm.org/authorize?N08592) (Henrik Nilsson, Antony Courtney, and John Peterson; 2002)
+* [Genuinely Functional User Interfaces](http://conal.net/papers/genuinely-functional-guis.pdf) (Antony Courtney and Conal Elliott; 2001)
+
+
+* See also:
+ * [Collection of Yampa diagrams](doc/diagrams/Diagrams.md)
+ * [Henrik Nilsson's publications](http://www.cs.nott.ac.uk/~psznhn/papers.html)
+ * [Ivan Perez's publications ](http://www.cs.nott.ac.uk/~psxip1/)
+ * [First Year PhD Report](http://www.cs.nott.ac.uk/~psxip1/papers/2014-Perez-1st-year-report.pdf) (Ivan Perez, 2014), chapter 3 includes a review of FRP and outlines some existing issues.
+
+## Related projects
+
+* [yampa-sdl2](https://github.com/Simre1/yampa-sdl2): Yampa and SDL2 made easy.
+* [Haskell-OpenGL-Tutorial](https://github.com/madjestic/Haskell-OpenGL-Tutorial/tree/master/MandelbrotYampa) same as [here](https://github.com/ubuntunux/LambdaEngine3D/tree/master/MandelbrotYampa): Visually attractive mandelbrot implementation.
+* [graphui](https://github.com/sinelaw/graphui): Attempt to implement Graphui.
+* [hamball](https://github.com/harley/hamball): 3D, LAN FPS game of hamster balls flying around and shooting lasers written in Haskell.
+* [yampa-glfw](https://github.com/deepfire/yampa-glfw): GLFW backend.
+* [Spaceinvaders](https://github.com/ivanperez-keera/SpaceInvaders): Re-write of the classic space invaders.
+* [Haskanoid](https://github.com/ivanperez-keera/haskanoid): Arkanoid clone in SDL with wiimote and kinect support that works on windows, linux, Mac, Android, and Web.
+* [Magic Cookies](http://haskell.games): iOS/Android haskell puzzle game.
+* [Pang-a-lambda](https://hackage.haskell.org/package/pang-a-lambda): 2D arcade game inspired by the classic super-pang.
+* [yampa-canvas](https://github.com/ku-fpg/yampa-canvas): Backend to blank-canvas / HTML5 Canvas.
+* [yampa-gloss](https://github.com/ivanperez-keera/yampa-gloss): Gloss backend.
+* [diagrams example](examples/Diagrams.hs): Demonstration of Yampa with Diagrams.
+* [Keera Hails](https://github.com/keera-studios/keera-hails/tree/master/keera-hails-reactive-yampa): Backend for reactive framework with GTK, WX, Qt, Android, iOS and HTML support.
+* [YampaSynth](http://hackage.haskell.org/package/YampaSynth): Software synthesizer.
+* [Frag](https://wiki.haskell.org/Frag): 3D first person shooter.
+* [cuboid](http://hackage.haskell.org/package/cuboid): 3D puzzle game with GLUT.
+* [Haskelloids](http://hackage.haskell.org/package/Haskelloids): Reproduction of the Atari 1979 classic "Asteroids".
+* [YFrob](hackage.haskell.org/package/YFrob): Yampa-based library for programming robots.
+* [YampaShooter](https://github.com/werk/YampaShooter): Top-down team based networked tank game.
+* [LaneWars](https://github.com/Mattiemus/LaneWars): Top-down MOBA game with online multiplayer.
+* [Functional Reactive Virtual Reality](https://imve.informatik.uni-hamburg.de/projects/FRVR): a fork of Yampa with extensions for VR.
+* [Dunai](https://github.com/ivanperez-keera/dunai): An FRP implementation inspired by Yampa that extends SFs with a monad.
+* [Bearriver](https://github.com/ivanperez-keera/dunai/tree/develop/examples/bearriver): API-compatible Yampa replacement built on top of dunai using Monadic Stream Functions.
+* [The Bearriver Arcade](https://github.com/walseb/The_Bearriver_Arcade): A couple of arcade games made using bearriver.
+
+## Help and collaboration
+
+You can collaborate at least in three ways:
+
+* File an issue (https://github.com/ivanperez-keera/Yampa/issues).
+* Write documentation (send a link and/or a pull request).
+* Research: we are constantly trying to improve Yampa. We'd be glad to have
+ collaborators. If you are working on this, please, let us know.
+
+ (_Interactivity and FRP is the main topic of my (ongoing) work and research,
+ so I'll keep working on this for some time._ -- Ivan Perez)
+
+## Authors
+
+* Henrik Nilsson
+* Antony Courtney
+
+### Maintainer
+
+* Ivan Perez
diff --git a/extensions/testing/Setup.hs b/yampa/Setup.hs
similarity index 100%
rename from extensions/testing/Setup.hs
rename to yampa/Setup.hs
diff --git a/Yampa.cabal b/yampa/Yampa.cabal
similarity index 100%
rename from Yampa.cabal
rename to yampa/Yampa.cabal
diff --git a/examples/Core.hs b/yampa/examples/Core.hs
similarity index 100%
rename from examples/Core.hs
rename to yampa/examples/Core.hs
diff --git a/examples/Diagrams.hs b/yampa/examples/Diagrams.hs
similarity index 100%
rename from examples/Diagrams.hs
rename to yampa/examples/Diagrams.hs
diff --git a/examples/Elevator/Elevator.hs b/yampa/examples/Elevator/Elevator.hs
similarity index 100%
rename from examples/Elevator/Elevator.hs
rename to yampa/examples/Elevator/Elevator.hs
diff --git a/examples/Elevator/TestElevatorMain.hs b/yampa/examples/Elevator/TestElevatorMain.hs
similarity index 100%
rename from examples/Elevator/TestElevatorMain.hs
rename to yampa/examples/Elevator/TestElevatorMain.hs
diff --git a/examples/TailgatingDetector/TailgatingDetector.hs b/yampa/examples/TailgatingDetector/TailgatingDetector.hs
similarity index 100%
rename from examples/TailgatingDetector/TailgatingDetector.hs
rename to yampa/examples/TailgatingDetector/TailgatingDetector.hs
diff --git a/examples/TailgatingDetector/TestTGMain.hs b/yampa/examples/TailgatingDetector/TestTGMain.hs
similarity index 100%
rename from examples/TailgatingDetector/TestTGMain.hs
rename to yampa/examples/TailgatingDetector/TestTGMain.hs
diff --git a/examples/Testing.hs b/yampa/examples/Testing.hs
similarity index 100%
rename from examples/Testing.hs
rename to yampa/examples/Testing.hs
diff --git a/examples/yampa-game/IdentityList.hs b/yampa/examples/yampa-game/IdentityList.hs
similarity index 100%
rename from examples/yampa-game/IdentityList.hs
rename to yampa/examples/yampa-game/IdentityList.hs
diff --git a/examples/yampa-game/MainBouncingBox.hs b/yampa/examples/yampa-game/MainBouncingBox.hs
similarity index 100%
rename from examples/yampa-game/MainBouncingBox.hs
rename to yampa/examples/yampa-game/MainBouncingBox.hs
diff --git a/examples/yampa-game/MainCircleMouse.hs b/yampa/examples/yampa-game/MainCircleMouse.hs
similarity index 100%
rename from examples/yampa-game/MainCircleMouse.hs
rename to yampa/examples/yampa-game/MainCircleMouse.hs
diff --git a/examples/yampa-game/MainWiimote.hs b/yampa/examples/yampa-game/MainWiimote.hs
similarity index 100%
rename from examples/yampa-game/MainWiimote.hs
rename to yampa/examples/yampa-game/MainWiimote.hs
diff --git a/examples/yampa-game/YampaSDL.hs b/yampa/examples/yampa-game/YampaSDL.hs
similarity index 100%
rename from examples/yampa-game/YampaSDL.hs
rename to yampa/examples/yampa-game/YampaSDL.hs
diff --git a/src/FRP/Yampa.hs b/yampa/src/FRP/Yampa.hs
similarity index 100%
rename from src/FRP/Yampa.hs
rename to yampa/src/FRP/Yampa.hs
diff --git a/src/FRP/Yampa/Arrow.hs b/yampa/src/FRP/Yampa/Arrow.hs
similarity index 100%
rename from src/FRP/Yampa/Arrow.hs
rename to yampa/src/FRP/Yampa/Arrow.hs
diff --git a/src/FRP/Yampa/Basic.hs b/yampa/src/FRP/Yampa/Basic.hs
similarity index 100%
rename from src/FRP/Yampa/Basic.hs
rename to yampa/src/FRP/Yampa/Basic.hs
diff --git a/src/FRP/Yampa/Conditional.hs b/yampa/src/FRP/Yampa/Conditional.hs
similarity index 100%
rename from src/FRP/Yampa/Conditional.hs
rename to yampa/src/FRP/Yampa/Conditional.hs
diff --git a/src/FRP/Yampa/Delays.hs b/yampa/src/FRP/Yampa/Delays.hs
similarity index 100%
rename from src/FRP/Yampa/Delays.hs
rename to yampa/src/FRP/Yampa/Delays.hs
diff --git a/src/FRP/Yampa/Diagnostics.hs b/yampa/src/FRP/Yampa/Diagnostics.hs
similarity index 100%
rename from src/FRP/Yampa/Diagnostics.hs
rename to yampa/src/FRP/Yampa/Diagnostics.hs
diff --git a/src/FRP/Yampa/Event.hs b/yampa/src/FRP/Yampa/Event.hs
similarity index 100%
rename from src/FRP/Yampa/Event.hs
rename to yampa/src/FRP/Yampa/Event.hs
diff --git a/src/FRP/Yampa/EventS.hs b/yampa/src/FRP/Yampa/EventS.hs
similarity index 100%
rename from src/FRP/Yampa/EventS.hs
rename to yampa/src/FRP/Yampa/EventS.hs
diff --git a/src/FRP/Yampa/Hybrid.hs b/yampa/src/FRP/Yampa/Hybrid.hs
similarity index 100%
rename from src/FRP/Yampa/Hybrid.hs
rename to yampa/src/FRP/Yampa/Hybrid.hs
diff --git a/src/FRP/Yampa/Integration.hs b/yampa/src/FRP/Yampa/Integration.hs
similarity index 100%
rename from src/FRP/Yampa/Integration.hs
rename to yampa/src/FRP/Yampa/Integration.hs
diff --git a/src/FRP/Yampa/InternalCore.hs b/yampa/src/FRP/Yampa/InternalCore.hs
similarity index 100%
rename from src/FRP/Yampa/InternalCore.hs
rename to yampa/src/FRP/Yampa/InternalCore.hs
diff --git a/src/FRP/Yampa/Loop.hs b/yampa/src/FRP/Yampa/Loop.hs
similarity index 100%
rename from src/FRP/Yampa/Loop.hs
rename to yampa/src/FRP/Yampa/Loop.hs
diff --git a/src/FRP/Yampa/Random.hs b/yampa/src/FRP/Yampa/Random.hs
similarity index 100%
rename from src/FRP/Yampa/Random.hs
rename to yampa/src/FRP/Yampa/Random.hs
diff --git a/src/FRP/Yampa/Scan.hs b/yampa/src/FRP/Yampa/Scan.hs
similarity index 100%
rename from src/FRP/Yampa/Scan.hs
rename to yampa/src/FRP/Yampa/Scan.hs
diff --git a/src/FRP/Yampa/Simulation.hs b/yampa/src/FRP/Yampa/Simulation.hs
similarity index 100%
rename from src/FRP/Yampa/Simulation.hs
rename to yampa/src/FRP/Yampa/Simulation.hs
diff --git a/src/FRP/Yampa/Switches.hs b/yampa/src/FRP/Yampa/Switches.hs
similarity index 100%
rename from src/FRP/Yampa/Switches.hs
rename to yampa/src/FRP/Yampa/Switches.hs
diff --git a/src/FRP/Yampa/Task.hs b/yampa/src/FRP/Yampa/Task.hs
similarity index 100%
rename from src/FRP/Yampa/Task.hs
rename to yampa/src/FRP/Yampa/Task.hs
diff --git a/src/FRP/Yampa/Time.hs b/yampa/src/FRP/Yampa/Time.hs
similarity index 100%
rename from src/FRP/Yampa/Time.hs
rename to yampa/src/FRP/Yampa/Time.hs
diff --git a/stack.yaml b/yampa/stack.yaml
similarity index 100%
rename from stack.yaml
rename to yampa/stack.yaml
diff --git a/tests/AFRPTests.hs b/yampa/tests/AFRPTests.hs
similarity index 100%
rename from tests/AFRPTests.hs
rename to yampa/tests/AFRPTests.hs
diff --git a/tests/AFRPTestsAccum.hs b/yampa/tests/AFRPTestsAccum.hs
similarity index 100%
rename from tests/AFRPTestsAccum.hs
rename to yampa/tests/AFRPTestsAccum.hs
diff --git a/tests/AFRPTestsArr.hs b/yampa/tests/AFRPTestsArr.hs
similarity index 100%
rename from tests/AFRPTestsArr.hs
rename to yampa/tests/AFRPTestsArr.hs
diff --git a/tests/AFRPTestsBasicSF.hs b/yampa/tests/AFRPTestsBasicSF.hs
similarity index 100%
rename from tests/AFRPTestsBasicSF.hs
rename to yampa/tests/AFRPTestsBasicSF.hs
diff --git a/tests/AFRPTestsCOC.hs b/yampa/tests/AFRPTestsCOC.hs
similarity index 100%
rename from tests/AFRPTestsCOC.hs
rename to yampa/tests/AFRPTestsCOC.hs
diff --git a/tests/AFRPTestsCommon.hs b/yampa/tests/AFRPTestsCommon.hs
similarity index 100%
rename from tests/AFRPTestsCommon.hs
rename to yampa/tests/AFRPTestsCommon.hs
diff --git a/tests/AFRPTestsComp.hs b/yampa/tests/AFRPTestsComp.hs
similarity index 100%
rename from tests/AFRPTestsComp.hs
rename to yampa/tests/AFRPTestsComp.hs
diff --git a/tests/AFRPTestsDelay.hs b/yampa/tests/AFRPTestsDelay.hs
similarity index 100%
rename from tests/AFRPTestsDelay.hs
rename to yampa/tests/AFRPTestsDelay.hs
diff --git a/tests/AFRPTestsDer.hs b/yampa/tests/AFRPTestsDer.hs
similarity index 100%
rename from tests/AFRPTestsDer.hs
rename to yampa/tests/AFRPTestsDer.hs
diff --git a/tests/AFRPTestsEmbed.hs b/yampa/tests/AFRPTestsEmbed.hs
similarity index 100%
rename from tests/AFRPTestsEmbed.hs
rename to yampa/tests/AFRPTestsEmbed.hs
diff --git a/tests/AFRPTestsEvSrc.hs b/yampa/tests/AFRPTestsEvSrc.hs
similarity index 100%
rename from tests/AFRPTestsEvSrc.hs
rename to yampa/tests/AFRPTestsEvSrc.hs
diff --git a/tests/AFRPTestsFirstSecond.hs b/yampa/tests/AFRPTestsFirstSecond.hs
similarity index 100%
rename from tests/AFRPTestsFirstSecond.hs
rename to yampa/tests/AFRPTestsFirstSecond.hs
diff --git a/tests/AFRPTestsKSwitch.hs b/yampa/tests/AFRPTestsKSwitch.hs
similarity index 100%
rename from tests/AFRPTestsKSwitch.hs
rename to yampa/tests/AFRPTestsKSwitch.hs
diff --git a/tests/AFRPTestsLaws.hs b/yampa/tests/AFRPTestsLaws.hs
similarity index 100%
rename from tests/AFRPTestsLaws.hs
rename to yampa/tests/AFRPTestsLaws.hs
diff --git a/tests/AFRPTestsLoop.hs b/yampa/tests/AFRPTestsLoop.hs
similarity index 100%
rename from tests/AFRPTestsLoop.hs
rename to yampa/tests/AFRPTestsLoop.hs
diff --git a/tests/AFRPTestsLoopIntegral.hs b/yampa/tests/AFRPTestsLoopIntegral.hs
similarity index 100%
rename from tests/AFRPTestsLoopIntegral.hs
rename to yampa/tests/AFRPTestsLoopIntegral.hs
diff --git a/tests/AFRPTestsLoopLaws.hs b/yampa/tests/AFRPTestsLoopLaws.hs
similarity index 100%
rename from tests/AFRPTestsLoopLaws.hs
rename to yampa/tests/AFRPTestsLoopLaws.hs
diff --git a/tests/AFRPTestsLoopPre.hs b/yampa/tests/AFRPTestsLoopPre.hs
similarity index 100%
rename from tests/AFRPTestsLoopPre.hs
rename to yampa/tests/AFRPTestsLoopPre.hs
diff --git a/tests/AFRPTestsPSwitch.hs b/yampa/tests/AFRPTestsPSwitch.hs
similarity index 100%
rename from tests/AFRPTestsPSwitch.hs
rename to yampa/tests/AFRPTestsPSwitch.hs
diff --git a/tests/AFRPTestsPre.hs b/yampa/tests/AFRPTestsPre.hs
similarity index 100%
rename from tests/AFRPTestsPre.hs
rename to yampa/tests/AFRPTestsPre.hs
diff --git a/tests/AFRPTestsRPSwitch.hs b/yampa/tests/AFRPTestsRPSwitch.hs
similarity index 100%
rename from tests/AFRPTestsRPSwitch.hs
rename to yampa/tests/AFRPTestsRPSwitch.hs
diff --git a/tests/AFRPTestsRSwitch.hs b/yampa/tests/AFRPTestsRSwitch.hs
similarity index 100%
rename from tests/AFRPTestsRSwitch.hs
rename to yampa/tests/AFRPTestsRSwitch.hs
diff --git a/tests/AFRPTestsReact.hs b/yampa/tests/AFRPTestsReact.hs
similarity index 100%
rename from tests/AFRPTestsReact.hs
rename to yampa/tests/AFRPTestsReact.hs
diff --git a/tests/AFRPTestsSscan.hs b/yampa/tests/AFRPTestsSscan.hs
similarity index 100%
rename from tests/AFRPTestsSscan.hs
rename to yampa/tests/AFRPTestsSscan.hs
diff --git a/tests/AFRPTestsSwitch.hs b/yampa/tests/AFRPTestsSwitch.hs
similarity index 100%
rename from tests/AFRPTestsSwitch.hs
rename to yampa/tests/AFRPTestsSwitch.hs
diff --git a/tests/AFRPTestsTask.hs b/yampa/tests/AFRPTestsTask.hs
similarity index 100%
rename from tests/AFRPTestsTask.hs
rename to yampa/tests/AFRPTestsTask.hs
diff --git a/tests/AFRPTestsUtils.hs b/yampa/tests/AFRPTestsUtils.hs
similarity index 100%
rename from tests/AFRPTestsUtils.hs
rename to yampa/tests/AFRPTestsUtils.hs
diff --git a/tests/AFRPTestsWFG.hs b/yampa/tests/AFRPTestsWFG.hs
similarity index 100%
rename from tests/AFRPTestsWFG.hs
rename to yampa/tests/AFRPTestsWFG.hs
diff --git a/tests/HaddockCoverage.hs b/yampa/tests/HaddockCoverage.hs
similarity index 100%
rename from tests/HaddockCoverage.hs
rename to yampa/tests/HaddockCoverage.hs
diff --git a/tests/hlint.hs b/yampa/tests/hlint.hs
similarity index 100%
rename from tests/hlint.hs
rename to yampa/tests/hlint.hs
diff --git a/tests/testAFRPMain.hs b/yampa/tests/testAFRPMain.hs
similarity index 100%
rename from tests/testAFRPMain.hs
rename to yampa/tests/testAFRPMain.hs