From 938721877d1a4d8d0c304ef43572856b1a39970a Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Wed, 17 Feb 2016 05:33:34 +0100 Subject: Monad transformers. --- .gitignore | 1 + LICENSE | 30 ++++++++++++++++++++++++++++++ Setup.hs | 2 ++ app/Main.hs | 6 ++++++ rougelike.cabal | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/Lib.hs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ stack.yaml | 35 +++++++++++++++++++++++++++++++++++ test/Spec.hs | 2 ++ 8 files changed, 170 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Setup.hs create mode 100644 app/Main.hs create mode 100644 rougelike.cabal create mode 100644 src/Lib.hs create mode 100644 stack.yaml create mode 100644 test/Spec.hs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c392f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.stack-work/* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fc03544 --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright Author name here (c) 2016 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Author name here nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..9d74405 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,6 @@ +module Main where + +import Lib + +main :: IO () +main = undefined diff --git a/rougelike.cabal b/rougelike.cabal new file mode 100644 index 0000000..b9a2c82 --- /dev/null +++ b/rougelike.cabal @@ -0,0 +1,46 @@ +name: rougelike +version: 0.1.0.0 +synopsis: Initial project template from stack +description: Please see README.md +homepage: http://github.com/githubuser/rougelike#readme +license: BSD3 +license-file: LICENSE +author: Author name here +maintainer: example@example.com +copyright: 2016 Author Here +category: Web +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +library + hs-source-dirs: src + exposed-modules: Lib + build-depends: + base + , lens + , data-default + , transformers + , mtl + default-language: Haskell2010 + +executable rougelike-exe + hs-source-dirs: app + main-is: Main.hs + ghc-options: -threaded -rtsopts -with-rtsopts=-N + build-depends: base + , rougelike + default-language: Haskell2010 + +test-suite rougelike-test + type: exitcode-stdio-1.0 + hs-source-dirs: test + main-is: Spec.hs + build-depends: base + , rougelike + ghc-options: -threaded -rtsopts -with-rtsopts=-N + default-language: Haskell2010 + +source-repository head + type: git + location: https://github.com/githubuser/rougelike diff --git a/src/Lib.hs b/src/Lib.hs new file mode 100644 index 0000000..9748aed --- /dev/null +++ b/src/Lib.hs @@ -0,0 +1,48 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +module Lib where + +import Control.Lens (makeLenses) +import Control.Monad.Identity (Identity(..)) +import Control.Monad.Reader (ReaderT(..), runReaderT) +import Control.Monad.Reader.Class (MonadReader(..)) +import Control.Monad.State.Class (MonadState(..)) +import Control.Monad.State.Strict (StateT(..), evalStateT) +import Data.Default (Default(..)) + +data Position = Position { _x :: Int, _y :: Int } + deriving (Show, Read) +instance Default Position where + def = Position 0 0 +makeLenses ''Position + +data Player = Player { + position :: Position} + deriving (Show, Read) +instance Default Player where + def = Player { position = def } +makeLenses ''Player + +newtype Config = Config String + deriving (Show) + +data World = World { + player :: Player} + deriving (Show, Read) +instance Default World where + def = World { player = def } +makeLenses ''World + +newtype App a = App { + runApp :: StateT World (ReaderT Config Identity) a} + deriving ( Applicative + , Functor + , Monad + , MonadState World + , MonadReader Config + ) + +evalApp :: App a -> World -> Config -> a +evalApp f world config = + runIdentity (runReaderT (evalStateT (runApp f) world) config) diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..28ee63e --- /dev/null +++ b/stack.yaml @@ -0,0 +1,35 @@ +# For more information, see: http://docs.haskellstack.org/en/stable/yaml_configuration.html + +# Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2) +resolver: lts-5.3 + +# Local packages, usually specified by relative directory name +packages: +- '.' + +# Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3) +extra-deps: [] + +# Override default flag values for local packages and extra-deps +flags: {} + +# Extra package databases containing global packages +extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true + +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: >= 1.0.0 + +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 + +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] + +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor diff --git a/test/Spec.hs b/test/Spec.hs new file mode 100644 index 0000000..cd4753f --- /dev/null +++ b/test/Spec.hs @@ -0,0 +1,2 @@ +main :: IO () +main = putStrLn "Test suite not yet implemented" -- cgit v1.2.3