[all] Reorganize haskell code into multiple packages
This commit is contained in:
parent
0edc241149
commit
4b8d0ee4a4
37 changed files with 368 additions and 140 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,2 @@
|
|||
.stack-work/
|
||||
forest.cabal
|
||||
*~
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Changelog for forest
|
||||
|
||||
## upcoming
|
||||
* create project
|
||||
- create project
|
||||
|
|
|
|||
2
Setup.hs
2
Setup.hs
|
|
@ -1,2 +0,0 @@
|
|||
import Distribution.Simple
|
||||
main = defaultMain
|
||||
1
forest-cabin/README.md
Normal file
1
forest-cabin/README.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
# forest-cabin
|
||||
52
forest-cabin/forest-cabin.cabal
Normal file
52
forest-cabin/forest-cabin.cabal
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
cabal-version: 1.12
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.31.2.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: c619b22393d818639b183c69031b267a4ed16faeaf609a75ef1cadb9288195e1
|
||||
|
||||
name: forest-cabin
|
||||
version: 0.1.0.0
|
||||
synopsis: A forest server hosted at forest.plugh.de
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
homepage: https://github.com/Garmelon/forest#readme
|
||||
bug-reports: https://github.com/Garmelon/forest/issues
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
maintainer: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
license: MIT
|
||||
build-type: Simple
|
||||
extra-source-files:
|
||||
README.md
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
location: https://github.com/Garmelon/forest
|
||||
|
||||
library
|
||||
other-modules:
|
||||
Paths_forest_cabin
|
||||
hs-source-dirs:
|
||||
src
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, forest-common
|
||||
, forest-server
|
||||
, websockets
|
||||
default-language: Haskell2010
|
||||
|
||||
executable forest-cabin
|
||||
main-is: Main.hs
|
||||
other-modules:
|
||||
Paths_forest_cabin
|
||||
hs-source-dirs:
|
||||
app
|
||||
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, forest-cabin
|
||||
, forest-common
|
||||
, forest-server
|
||||
, websockets
|
||||
default-language: Haskell2010
|
||||
32
forest-cabin/package.yaml
Normal file
32
forest-cabin/package.yaml
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
name: forest-cabin
|
||||
version: 0.1.0.0
|
||||
license: MIT
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
|
||||
synopsis: A forest server hosted at forest.plugh.de
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
github: Garmelon/forest
|
||||
|
||||
extra-source-files:
|
||||
- README.md
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- forest-common
|
||||
- forest-server
|
||||
- websockets
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
||||
executables:
|
||||
forest-cabin:
|
||||
source-dirs: app
|
||||
main: Main.hs
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- forest-cabin
|
||||
1
forest-common/README.md
Normal file
1
forest-common/README.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
# forest-common
|
||||
44
forest-common/forest-common.cabal
Normal file
44
forest-common/forest-common.cabal
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
cabal-version: 1.12
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.31.2.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: e59723e563cf364a74b1032409ed7a9d3ecbec3a6baa34554771cb5c1a5689d9
|
||||
|
||||
name: forest-common
|
||||
version: 0.1.0.0
|
||||
synopsis: A tree-based multi-user interaction thing
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
homepage: https://github.com/Garmelon/forest#readme
|
||||
bug-reports: https://github.com/Garmelon/forest/issues
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
maintainer: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
license: MIT
|
||||
build-type: Simple
|
||||
extra-source-files:
|
||||
README.md
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
location: https://github.com/Garmelon/forest
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
Forest.Api
|
||||
Forest.Node
|
||||
Forest.OrderedMap
|
||||
Forest.Util
|
||||
other-modules:
|
||||
Paths_forest_common
|
||||
hs-source-dirs:
|
||||
src
|
||||
build-depends:
|
||||
aeson
|
||||
, async
|
||||
, base >=4.7 && <5
|
||||
, containers
|
||||
, text
|
||||
, websockets
|
||||
default-language: Haskell2010
|
||||
23
forest-common/package.yaml
Normal file
23
forest-common/package.yaml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
name: forest-common
|
||||
version: 0.1.0.0
|
||||
license: MIT
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
|
||||
synopsis: A tree-based multi-user interaction thing
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
github: Garmelon/forest
|
||||
|
||||
extra-source-files:
|
||||
- README.md
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- aeson
|
||||
- async
|
||||
- containers
|
||||
- text
|
||||
- websockets
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
|
@ -1,11 +1,16 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Forest.Util
|
||||
( findPrev
|
||||
(
|
||||
-- * List operations
|
||||
findPrev
|
||||
, findNext
|
||||
-- * Monadic looping constructs
|
||||
, whileM
|
||||
, runUntilJustM
|
||||
, whileNothingM
|
||||
-- * Multithreading helpers
|
||||
, withThread
|
||||
-- * Websocket helper functions
|
||||
, sendPacket
|
||||
, closeWithErrorMessage
|
||||
, receivePacket
|
||||
|
|
@ -24,9 +29,6 @@ findPrev f as = fst <$> find (f . snd) (zip as $ tail as)
|
|||
findNext :: (a -> Bool) -> [a] -> Maybe a
|
||||
findNext f as = snd <$> find (f . fst) (zip as $ tail as)
|
||||
|
||||
withThread :: IO () -> IO () -> IO ()
|
||||
withThread thread main = withAsync thread $ const main
|
||||
|
||||
-- | Run a monadic action until it returns @False@ for the first time.
|
||||
whileM :: Monad m => m Bool -> m ()
|
||||
whileM f = do
|
||||
|
|
@ -36,13 +38,16 @@ whileM f = do
|
|||
else pure ()
|
||||
|
||||
-- | Run a monadic action until it returns @Just a@ for the first time.
|
||||
runUntilJustM :: Monad m => m (Maybe a) -> m a
|
||||
runUntilJustM f = do
|
||||
whileNothingM :: Monad m => m (Maybe a) -> m a
|
||||
whileNothingM f = do
|
||||
result <- f
|
||||
case result of
|
||||
Nothing -> runUntilJustM f
|
||||
Nothing -> whileNothingM f
|
||||
Just a -> pure a
|
||||
|
||||
withThread :: IO () -> IO () -> IO ()
|
||||
withThread thread main = withAsync thread $ const main
|
||||
|
||||
sendPacket :: ToJSON a => WS.Connection -> a -> IO ()
|
||||
sendPacket conn packet = WS.sendTextData conn $ encode packet
|
||||
|
||||
1
forest-server/README.md
Normal file
1
forest-server/README.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
# forest-server
|
||||
47
forest-server/forest-server.cabal
Normal file
47
forest-server/forest-server.cabal
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
cabal-version: 1.12
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.31.2.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: c0d366de2ff27f13dd69d751b47017143df332454ad700dd8fb5089d9837f1a8
|
||||
|
||||
name: forest-server
|
||||
version: 0.1.0.0
|
||||
synopsis: A framework for forest servers
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
homepage: https://github.com/Garmelon/forest#readme
|
||||
bug-reports: https://github.com/Garmelon/forest/issues
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
maintainer: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
license: MIT
|
||||
build-type: Simple
|
||||
extra-source-files:
|
||||
README.md
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
location: https://github.com/Garmelon/forest
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
Forest.Server
|
||||
Forest.Server.Broadcast
|
||||
Forest.Server.TreeModule
|
||||
Forest.Server.TreeModule.Animate
|
||||
Forest.Server.TreeModule.Const
|
||||
Forest.Server.TreeModule.Fork
|
||||
Forest.Server.TreeModule.SharedEditing
|
||||
other-modules:
|
||||
Paths_forest_server
|
||||
hs-source-dirs:
|
||||
src
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, containers
|
||||
, forest-common
|
||||
, text
|
||||
, transformers
|
||||
, websockets
|
||||
default-language: Haskell2010
|
||||
23
forest-server/package.yaml
Normal file
23
forest-server/package.yaml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
name: forest-server
|
||||
version: 0.1.0.0
|
||||
license: MIT
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
|
||||
synopsis: A framework for forest servers
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
github: Garmelon/forest
|
||||
|
||||
extra-source-files:
|
||||
- README.md
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- containers
|
||||
- forest-common
|
||||
- text
|
||||
- transformers
|
||||
- websockets
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
|
@ -32,7 +32,7 @@ sendUpdatesThread conn nodeChan nodeA = do
|
|||
{- Main server application that receives and processes client packets -}
|
||||
|
||||
receivePackets :: TreeModule a () => WS.Connection -> a () -> IO ()
|
||||
receivePackets conn treeModule = runUntilJustM $ do
|
||||
receivePackets conn treeModule = whileNothingM $ do
|
||||
packet <- receivePacket conn
|
||||
case packet of
|
||||
ClientEdit path text -> do
|
||||
1
forest-tui/README.md
Normal file
1
forest-tui/README.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
# forest-tui
|
||||
74
forest-tui/forest-tui.cabal
Normal file
74
forest-tui/forest-tui.cabal
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
cabal-version: 1.12
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.31.2.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: 9ca3a1fe555e2dceb3459b6ae920b1ed93aac76398d4909a7030d7992b79ce40
|
||||
|
||||
name: forest-tui
|
||||
version: 0.1.0.0
|
||||
synopsis: A terminal-based client for forest
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
homepage: https://github.com/Garmelon/forest#readme
|
||||
bug-reports: https://github.com/Garmelon/forest/issues
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
maintainer: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
license: MIT
|
||||
build-type: Simple
|
||||
extra-source-files:
|
||||
README.md
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
location: https://github.com/Garmelon/forest
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
Forest.Client
|
||||
Forest.Client.NodeUtil
|
||||
Forest.Client.Options
|
||||
Forest.Client.UiState
|
||||
Forest.Client.Websocket
|
||||
Forest.Client.Widgets.NodeEditor
|
||||
Forest.Client.Widgets.WidgetTree
|
||||
other-modules:
|
||||
Paths_forest_tui
|
||||
hs-source-dirs:
|
||||
src
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, brick
|
||||
, containers
|
||||
, forest-common
|
||||
, optparse-applicative
|
||||
, safe
|
||||
, text
|
||||
, text-zipper
|
||||
, vty
|
||||
, websockets
|
||||
, wuss
|
||||
default-language: Haskell2010
|
||||
|
||||
executable forest
|
||||
main-is: Main.hs
|
||||
other-modules:
|
||||
Paths_forest_tui
|
||||
hs-source-dirs:
|
||||
app
|
||||
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, brick
|
||||
, containers
|
||||
, forest-common
|
||||
, forest-tui
|
||||
, optparse-applicative
|
||||
, safe
|
||||
, text
|
||||
, text-zipper
|
||||
, vty
|
||||
, websockets
|
||||
, wuss
|
||||
default-language: Haskell2010
|
||||
39
forest-tui/package.yaml
Normal file
39
forest-tui/package.yaml
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
name: forest-tui
|
||||
version: 0.1.0.0
|
||||
license: MIT
|
||||
author: Garmelon <joscha@plugh.de>
|
||||
copyright: 2020 Garmelon
|
||||
|
||||
synopsis: A terminal-based client for forest
|
||||
description: Please see the README at <https://github.com/Garmelon/forest#readme>
|
||||
github: Garmelon/forest
|
||||
|
||||
extra-source-files:
|
||||
- README.md
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- brick
|
||||
- containers
|
||||
- forest-common
|
||||
- optparse-applicative
|
||||
- safe
|
||||
- text
|
||||
- text-zipper
|
||||
- vty
|
||||
- websockets
|
||||
- wuss
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
||||
executables:
|
||||
forest:
|
||||
source-dirs: app
|
||||
main: Main.hs
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- forest-tui
|
||||
|
|
@ -11,13 +11,13 @@ import Brick.BChan
|
|||
import Brick.Widgets.Edit
|
||||
import Control.Monad
|
||||
import Control.Monad.IO.Class
|
||||
import qualified Graphics.Vty as Vty
|
||||
import qualified Network.WebSockets as WS
|
||||
import qualified Graphics.Vty as Vty
|
||||
import qualified Network.WebSockets as WS
|
||||
|
||||
import Forest.Api
|
||||
import Forest.Client.UiState
|
||||
import Forest.Client.Websocket
|
||||
import Forest.Client.WidgetTree
|
||||
import Forest.Client.Widgets.WidgetTree
|
||||
import Forest.Node
|
||||
import Forest.Util
|
||||
|
||||
|
|
@ -35,16 +35,16 @@ module Forest.Client.UiState
|
|||
import Brick
|
||||
import Data.List
|
||||
import Data.Maybe
|
||||
import qualified Data.Set as Set
|
||||
import qualified Data.Text as T
|
||||
import qualified Graphics.Vty as Vty
|
||||
import qualified Data.Set as Set
|
||||
import qualified Data.Text as T
|
||||
import qualified Graphics.Vty as Vty
|
||||
import Safe
|
||||
|
||||
import Forest.Client.NodeEditor
|
||||
import Forest.Client.NodeUtil
|
||||
import Forest.Client.WidgetTree
|
||||
import Forest.Client.Widgets.NodeEditor
|
||||
import Forest.Client.Widgets.WidgetTree
|
||||
import Forest.Node
|
||||
import qualified Forest.OrderedMap as OMap
|
||||
import qualified Forest.OrderedMap as OMap
|
||||
|
||||
data EditorInfo n = EditorInfo
|
||||
{ eiEditor :: !(NodeEditor n)
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Forest.Client.NodeEditor
|
||||
module Forest.Client.Widgets.NodeEditor
|
||||
( NodeEditor
|
||||
, getCurrentText
|
||||
, beginEdit
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Forest.Client.WidgetTree
|
||||
module Forest.Client.Widgets.WidgetTree
|
||||
( WidgetTree(..)
|
||||
, renderWidgetTreeWith
|
||||
, renderWidgetTree
|
||||
52
package.yaml
52
package.yaml
|
|
@ -1,52 +0,0 @@
|
|||
name: forest
|
||||
version: 0.1.0.0
|
||||
license: MIT
|
||||
author: "Garmelon <joscha@plugh.de>"
|
||||
copyright: "2020 Garmelon"
|
||||
|
||||
synopsis: A tree-based multi-user interaction thing
|
||||
description: Please see the README on GitHub at <https://github.com/Garmelon/forest#readme>
|
||||
github: "Garmelon/forest"
|
||||
|
||||
extra-source-files:
|
||||
- README.md
|
||||
- CHANGELOG.md
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- aeson
|
||||
- async
|
||||
- brick
|
||||
- containers
|
||||
- optparse-applicative
|
||||
- safe
|
||||
- text
|
||||
- text-zipper
|
||||
- transformers
|
||||
- vty
|
||||
- websockets
|
||||
- wuss
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
||||
executables:
|
||||
forest-server:
|
||||
main: Main.hs
|
||||
source-dirs: server
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- forest
|
||||
|
||||
forest-client:
|
||||
main: Main.hs
|
||||
source-dirs: client
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- forest
|
||||
68
stack.yaml
68
stack.yaml
|
|
@ -1,66 +1,6 @@
|
|||
# This file was automatically generated by 'stack init'
|
||||
#
|
||||
# Some commonly used options have been documented as comments in this file.
|
||||
# For advanced use and comprehensive documentation of the format, please see:
|
||||
# https://docs.haskellstack.org/en/stable/yaml_configuration/
|
||||
|
||||
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
|
||||
# A snapshot resolver dictates the compiler version and the set of packages
|
||||
# to be used for project dependencies. For example:
|
||||
#
|
||||
# resolver: lts-3.5
|
||||
# resolver: nightly-2015-09-21
|
||||
# resolver: ghc-7.10.2
|
||||
#
|
||||
# The location of a snapshot can be provided as a file or url. Stack assumes
|
||||
# a snapshot provided as a file might change, whereas a url resource does not.
|
||||
#
|
||||
# resolver: ./custom-snapshot.yaml
|
||||
# resolver: https://example.com/snapshots/2018-01-01.yaml
|
||||
resolver: lts-15.1
|
||||
|
||||
# User packages to be built.
|
||||
# Various formats can be used as shown in the example below.
|
||||
#
|
||||
# packages:
|
||||
# - some-directory
|
||||
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
|
||||
# subdirs:
|
||||
# - auto-update
|
||||
# - wai
|
||||
packages:
|
||||
- .
|
||||
# Dependency packages to be pulled from upstream that are not in the resolver.
|
||||
# These entries can reference officially published versions as well as
|
||||
# forks / in-progress versions pinned to a git hash. For example:
|
||||
#
|
||||
# extra-deps:
|
||||
# - acme-missiles-0.3
|
||||
# - git: https://github.com/commercialhaskell/stack.git
|
||||
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||
#
|
||||
# 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: ">=2.1"
|
||||
#
|
||||
# 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
|
||||
- forest-cabin
|
||||
- forest-common
|
||||
- forest-server
|
||||
- forest-tui
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue