From c481ea49816599bec924836f2fe465555ff3f9bc Mon Sep 17 00:00:00 2001 From: Tissevert Date: Fri, 3 May 2019 07:58:44 +0200 Subject: [PATCH] Starting with simple streams --- CHANGELOG.md | 5 +++++ LICENSE | 30 ++++++++++++++++++++++++++++++ Mainate.cabal | 26 ++++++++++++++++++++++++++ src/Stream.hs | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 Mainate.cabal create mode 100644 src/Stream.hs diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..1a3c5ae --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for Mainate + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..42f34d0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2019, Tissevert + +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 Tissevert 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. diff --git a/Mainate.cabal b/Mainate.cabal new file mode 100644 index 0000000..34d37ed --- /dev/null +++ b/Mainate.cabal @@ -0,0 +1,26 @@ +cabal-version: >=1.10 +-- Initial package description 'Mainate.cabal' generated by 'cabal init'. +-- For further documentation, see http://haskell.org/cabal/users-guide/ + +name: Mainate +version: 0.1.0.0 +synopsis: An NLP library to write parsers +-- description: +homepage: https://git.marvid.fr/Tissevert/Mainate.git +-- bug-reports: +license: BSD3 +license-file: LICENSE +author: Tissevert +maintainer: tissevert+devel@marvid.fr +-- copyright: +category: Language +build-type: Simple +extra-source-files: CHANGELOG.md + +library + exposed-modules: Stream + -- other-modules: + -- other-extensions: + build-depends: base >=4.12 && <4.13 + hs-source-dirs: src + default-language: Haskell2010 diff --git a/src/Stream.hs b/src/Stream.hs new file mode 100644 index 0000000..7fefe2c --- /dev/null +++ b/src/Stream.hs @@ -0,0 +1,40 @@ +module Stream ( + Stream(..) + ) where + +import Data.List (intercalate) + +data Stream a = Stream [(a, Stream a)] deriving Show + +instance Semigroup (Stream a) where + (<>) (Stream []) b = b + (<>) (Stream pairs) b = Stream $ (\(a, stream) -> (a, stream <> b)) <$> pairs + +instance Monoid (Stream a) where + mempty = fromList [] + +fromList :: [a] -> Stream a +fromList [] = Stream [] +fromList (pair:pairs) = Stream [(pair, fromList pairs)] + +infinite :: a -> Stream a +infinite a = Stream [(a, infinite a)] + +showTree :: Show a => Stream a -> String +showTree = intercalate "\n" . getLines + where + getLines (Stream []) = ["●"] + getLines (Stream pairs) = + concat $ (\(a, stream) -> showElem a $ getLines stream) <$> pairs + +showElem :: Show a => a -> [String] -> [String] +showElem _ [] = [] +showElem a [l] = ["— " ++ show a ++ " —" ++ l] +showElem a (l:ls) = + let prefix = "─ " ++ show a ++ " ─┬" in + let padding = take (length prefix - 1) $ repeat ' ' in + (prefix ++ l) : (pad padding ls) + where + pad _ [] = [] + pad padding [x] = [padding ++ '╰' : x] + pad padding (x:xs) = (padding ++ '├' : x) : (pad padding xs)