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 Video | Peoplemon by Alex Stuart | Space Invaders | -|-------------------------------------------|---------------|-------------------------| -| 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 Video | Peoplemon by Alex Stuart | Space Invaders | +|-------------------------------------------|---------------|-------------------------| +| 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