288 lines
7.3 KiB
Plaintext
288 lines
7.3 KiB
Plaintext
|
{-# START_FILE package.yaml #-}
|
||
|
name: {{name}}
|
||
|
version: 0.1.0.0
|
||
|
github: {{github-username}}{{^github-username}}githubuser{{/github-username}}/{{name}}
|
||
|
license: BSD3
|
||
|
author: {{author-name}}{{^author-name}}Author name here{{/author-name}}
|
||
|
maintainer: {{author-email}}{{^author-email}}example@example.com{{/author-email}}
|
||
|
copyright: {{copyright}}{{^copyright}}{{year}}{{^year}}2022{{/year}} {{author-name}}{{^author-name}}Author name here{{/author-name}}{{/copyright}}
|
||
|
|
||
|
extra-source-files:
|
||
|
- README.md
|
||
|
- CHANGELOG.md
|
||
|
|
||
|
# Metadata used when publishing your package
|
||
|
# synopsis: Short description of your package
|
||
|
# category: Web
|
||
|
|
||
|
# To avoid duplicated efforts in documentation and dealing with the
|
||
|
# complications of embedding Haddock markup inside cabal files, it is
|
||
|
# common to point users to the README.md file.
|
||
|
description: Please see the README on Github at <https://github.com/{{github-username}}{{^github-username}}githubuser{{/github-username}}/{{name}}#readme>
|
||
|
|
||
|
default-extensions:
|
||
|
# incentivise rio
|
||
|
- NoImplicitPrelude
|
||
|
|
||
|
# avoid using strings
|
||
|
- OverloadedStrings
|
||
|
|
||
|
# more powerful type system
|
||
|
- FlexibleContexts
|
||
|
- FlexibleInstances
|
||
|
- InstanceSigs
|
||
|
- MultiParamTypeClasses
|
||
|
- RankNTypes
|
||
|
- GADTs
|
||
|
- FunctionalDependencies
|
||
|
- EmptyDataDecls
|
||
|
|
||
|
# derive all the things
|
||
|
- DeriveFoldable
|
||
|
- DeriveFunctor
|
||
|
- DeriveGeneric
|
||
|
- DeriveLift
|
||
|
- DeriveTraversable
|
||
|
- DerivingStrategies
|
||
|
- DeriveDataTypeable
|
||
|
- GeneralizedNewtypeDeriving
|
||
|
- StandaloneDeriving
|
||
|
|
||
|
# better function syntax
|
||
|
- EmptyCase
|
||
|
- LambdaCase
|
||
|
- MultiWayIf
|
||
|
- NamedFieldPuns
|
||
|
- TupleSections
|
||
|
- BangPatterns
|
||
|
- BinaryLiterals
|
||
|
|
||
|
# better type syntax
|
||
|
- PartialTypeSignatures
|
||
|
- TypeOperators
|
||
|
- ScopedTypeVariables
|
||
|
- TypeApplications
|
||
|
- ConstraintKinds
|
||
|
- DefaultSignatures
|
||
|
- DataKinds
|
||
|
- TypeFamilies
|
||
|
- ViewPatterns
|
||
|
|
||
|
ghc-options:
|
||
|
- -Wall
|
||
|
- -Wcompat
|
||
|
- -Widentities
|
||
|
- -Wincomplete-record-updates
|
||
|
- -Wincomplete-uni-patterns
|
||
|
- -Wmissing-export-lists
|
||
|
- -Wmissing-home-modules
|
||
|
- -Wpartial-fields
|
||
|
- -Wredundant-constraints
|
||
|
|
||
|
dependencies:
|
||
|
- base >= 4.11 && < 10
|
||
|
- rio >= 0.1.12.0
|
||
|
|
||
|
library:
|
||
|
source-dirs: src
|
||
|
|
||
|
executables:
|
||
|
{{name}}-exe:
|
||
|
main: Main.hs
|
||
|
source-dirs: app
|
||
|
dependencies:
|
||
|
- {{name}}
|
||
|
- optparse-simple
|
||
|
|
||
|
ghc-options:
|
||
|
- -threaded
|
||
|
- -rtsopts
|
||
|
- -with-rtsopts=-N
|
||
|
|
||
|
tests:
|
||
|
{{name}}-test:
|
||
|
main: Spec.hs
|
||
|
source-dirs: test
|
||
|
dependencies:
|
||
|
- {{name}}
|
||
|
- hspec
|
||
|
|
||
|
ghc-options:
|
||
|
- -threaded
|
||
|
- -rtsopts
|
||
|
- -with-rtsopts=-N
|
||
|
|
||
|
{-# START_FILE Setup.hs #-}
|
||
|
import Distribution.Simple
|
||
|
main = defaultMain
|
||
|
|
||
|
{-# START_FILE app/Main.hs #-}
|
||
|
{-# LANGUAGE TemplateHaskell #-}
|
||
|
module Main (main) where
|
||
|
|
||
|
import Import
|
||
|
import Run
|
||
|
import RIO.Process
|
||
|
import Options.Applicative.Simple
|
||
|
import qualified Paths_{{name-as-varid}}
|
||
|
|
||
|
main :: IO ()
|
||
|
main = do
|
||
|
(options, ()) <- simpleOptions
|
||
|
$(simpleVersion Paths_{{name-as-varid}}.version)
|
||
|
"Header for command line arguments"
|
||
|
"Program description, also for command line arguments"
|
||
|
(Options
|
||
|
<$> switch ( long "verbose"
|
||
|
<> short 'v'
|
||
|
<> help "Verbose output?"
|
||
|
)
|
||
|
)
|
||
|
empty
|
||
|
lo <- logOptionsHandle stderr (optionsVerbose options)
|
||
|
pc <- mkDefaultProcessContext
|
||
|
withLogFunc lo $ \lf ->
|
||
|
let app = App
|
||
|
{ appLogFunc = lf
|
||
|
, appProcessContext = pc
|
||
|
, appOptions = options
|
||
|
}
|
||
|
in runRIO app run
|
||
|
|
||
|
{-# START_FILE src/Import.hs #-}
|
||
|
module Import
|
||
|
( module RIO
|
||
|
, module Types
|
||
|
) where
|
||
|
|
||
|
import RIO
|
||
|
import Types
|
||
|
|
||
|
{-# START_FILE src/Run.hs #-}
|
||
|
module Run (run) where
|
||
|
|
||
|
import Import
|
||
|
|
||
|
run :: RIO App ()
|
||
|
run = do
|
||
|
logInfo "We're inside the application!"
|
||
|
|
||
|
{-# START_FILE src/Types.hs #-}
|
||
|
module Types
|
||
|
( App (..)
|
||
|
, Options (..)
|
||
|
) where
|
||
|
|
||
|
import RIO
|
||
|
import RIO.Process
|
||
|
|
||
|
-- | Command line arguments
|
||
|
data Options = Options
|
||
|
{ optionsVerbose :: !Bool
|
||
|
}
|
||
|
|
||
|
data App = App
|
||
|
{ appLogFunc :: !LogFunc
|
||
|
, appProcessContext :: !ProcessContext
|
||
|
, appOptions :: !Options
|
||
|
-- Add other app-specific configuration information here
|
||
|
}
|
||
|
|
||
|
instance HasLogFunc App where
|
||
|
logFuncL = lens appLogFunc (\x y -> x { appLogFunc = y })
|
||
|
instance HasProcessContext App where
|
||
|
processContextL = lens appProcessContext (\x y -> x { appProcessContext = y })
|
||
|
|
||
|
{-# START_FILE src/Util.hs #-}
|
||
|
-- | Silly utility module, used to demonstrate how to write a test
|
||
|
-- case.
|
||
|
module Util
|
||
|
( plus2
|
||
|
) where
|
||
|
|
||
|
import RIO
|
||
|
|
||
|
plus2 :: Int -> Int
|
||
|
plus2 = (+ 2)
|
||
|
|
||
|
{-# START_FILE test/Spec.hs #-}
|
||
|
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
|
||
|
|
||
|
{-# START_FILE test/UtilSpec.hs #-}
|
||
|
module UtilSpec (spec) where
|
||
|
|
||
|
import Import
|
||
|
import Util
|
||
|
import Test.Hspec
|
||
|
import Test.Hspec.QuickCheck
|
||
|
|
||
|
spec :: Spec
|
||
|
spec = do
|
||
|
describe "plus2" $ do
|
||
|
it "basic check" $ plus2 0 `shouldBe` 2
|
||
|
it "overflow" $ plus2 maxBound `shouldBe` minBound + 1
|
||
|
prop "minus 2" $ \i -> plus2 i - 2 `shouldBe` i
|
||
|
|
||
|
{-# START_FILE README.md #-}
|
||
|
# {{name}}
|
||
|
|
||
|
## Execute
|
||
|
|
||
|
* Run `stack exec -- {{name}}-exe` to see "We're inside the application!"
|
||
|
* With `stack exec -- {{name}}-exe --verbose` you will see the same message, with more logging.
|
||
|
|
||
|
## Run tests
|
||
|
|
||
|
`stack test`
|
||
|
|
||
|
{-# START_FILE CHANGELOG.md #-}
|
||
|
# Changelog for `{{ name }}`
|
||
|
|
||
|
All notable changes to this project will be documented in this file.
|
||
|
|
||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||
|
and this project adheres to the
|
||
|
[Haskell Package Versioning Policy](https://pvp.haskell.org/).
|
||
|
|
||
|
## Unreleased
|
||
|
|
||
|
## 0.1.0.0 - YYYY-MM-DD
|
||
|
|
||
|
{-# START_FILE LICENSE #-}
|
||
|
Copyright {{author-name}}{{^author-name}}Author name here{{/author-name}} (c) {{year}}{{^year}}2022{{/year}}
|
||
|
|
||
|
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}}{{^copyright}}{{year}}{{^year}}2022{{/year}} {{author-name}}{{^author-name}}Author name here{{/author-name}}{{/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}}{{^copyright}}{{year}}{{^year}}2022{{/year}} {{author-name}}{{^author-name}}Author name here{{/author-name}}{{/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.
|
||
|
|
||
|
{-# START_FILE .gitignore #-}
|
||
|
*~
|
||
|
*.swp
|
||
|
tarballs/
|
||
|
.stack-work/
|