From 24392dba022f0c102b3661632a86ee7e5ef59b37 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= <hugo@lysator.liu.se>
Date: Mon, 22 Feb 2021 23:31:13 +0100
Subject: [PATCH] Restructure directory layout.

---
 CodeGenTest.hs                                | 53 +++++++++++++++++++
 LysKom.hs                                     |  2 +-
 Test2.hs => LysKom/Internal/CodeGen.hs        | 10 ++--
 LineFormat.lhs => LysKom/LineFormat.lhs       |  2 +-
 {Text/Parsers => LysKom}/ProtocolA.lhs        | 10 ++--
 {Text/Parsers => LysKom}/ProtocolA/Data.lhs   |  4 +-
 .../Parsers => LysKom/ProtocolA}/Helpers.lhs  |  2 +-
 .../Parsers => LysKom}/ProtocolA/Requests.lhs |  8 +--
 {Text/Parsers => LysKom}/ProtocolA/Types.lhs  |  4 +-
 LysKom/Types.hs                               | 31 +++++++++++
 doc/main.tex                                  | 10 ++--
 11 files changed, 110 insertions(+), 26 deletions(-)
 create mode 100644 CodeGenTest.hs
 rename Test2.hs => LysKom/Internal/CodeGen.hs (98%)
 rename LineFormat.lhs => LysKom/LineFormat.lhs (98%)
 rename {Text/Parsers => LysKom}/ProtocolA.lhs (93%)
 rename {Text/Parsers => LysKom}/ProtocolA/Data.lhs (91%)
 rename {Text/Parsers => LysKom/ProtocolA}/Helpers.lhs (97%)
 rename {Text/Parsers => LysKom}/ProtocolA/Requests.lhs (89%)
 rename {Text/Parsers => LysKom}/ProtocolA/Types.lhs (98%)
 create mode 100644 LysKom/Types.hs

diff --git a/CodeGenTest.hs b/CodeGenTest.hs
new file mode 100644
index 0000000..3eb9dad
--- /dev/null
+++ b/CodeGenTest.hs
@@ -0,0 +1,53 @@
+
+import LysKom.Internal.CodeGen (f)
+import Language.Haskell.TH (runQ, runIO, pprint)
+import LysKom.ProtocolA (documentParser)
+import Text.ParserCombinators.Parsec (parseFromFile)
+import Data.Either (rights)
+import Data.List
+import LysKom.ProtocolA.Data (ProtocolAItem (..))
+import LysKom.ProtocolA.Types 
+    ( LysType ( ENUMERATION_OF
+              , ENUMERATION
+              , SELECTION
+              ))
+
+proc :: ProtocolAItem -> Int
+proc (Comment _)        = 0
+proc (DerivedType _ _)  = 1
+proc (Request _ _ _ _)  = 3
+proc (Async _ _ _)      = 5
+proc (ProtoEdition _)   = 0
+proc (ProtoVer _)       = 0
+proc (LysKomDVersion _) = 0
+proc (TypeAlias _ _)    = 2
+proc (RequestAlias _ _) = 4
+proc (AsyncAlias _ _)   = 6
+proc (Other _)          = 9
+
+selection2Enum :: LysType -> LysType
+selection2Enum (SELECTION xs) = ENUMERATION [ (n ++ "E", i) | (i, n, _) <- xs ]
+ 
+
+isSelect :: String -> ProtocolAItem -> Bool
+isSelect m (DerivedType n d) = n == m
+isSelect _ _                 = False
+
+enumOf2Enum :: [ProtocolAItem] -> ProtocolAItem -> ProtocolAItem
+enumOf2Enum lst (DerivedType n (ENUMERATION_OF t)) 
+    = let (DerivedType m selection) = head $ filter (isSelect t) lst
+      in  DerivedType n . selection2Enum $ selection 
+enumOf2Enum lst a = a
+
+
+main :: IO ()
+main = do
+    d <- parseFromFile documentParser "/usr/share/doc/lyskom/protocol-a-full.txt"
+    let dat = sortOn proc $ head $ rights [d]
+    let dat' = map (enumOf2Enum dat) dat
+    
+    -- runQ (return $ concat $ map f dat) >>= putStrLn.pprint
+    -- {-# LANGUAGE DuplicateRecordFields #-}
+    ((mconcat <$>) $ mapM runQ $ map f dat') >>= putStrLn.pprint
+
+
diff --git a/LysKom.hs b/LysKom.hs
index 26b39b7..f61a6fc 100644
--- a/LysKom.hs
+++ b/LysKom.hs
@@ -16,7 +16,7 @@ import Control.Concurrent.Async
 import Control.Monad.IO.Class
 import Control.Monad.State.Strict
 
-import LineFormat
+import LysKom.LineFormat
 
 import Data.Attoparsec.ByteString
 import Data.Attoparsec.ByteString.Char8 hiding (char8)
diff --git a/Test2.hs b/LysKom/Internal/CodeGen.hs
similarity index 98%
rename from Test2.hs
rename to LysKom/Internal/CodeGen.hs
index 154dba2..d9c5877 100644
--- a/Test2.hs
+++ b/LysKom/Internal/CodeGen.hs
@@ -1,12 +1,12 @@
 {-# LANGUAGE TemplateHaskell #-}
 
-module Test2 where
+module LysKom.Internal.CodeGen where
 
 import Language.Haskell.TH
 import Language.Haskell.TH.Syntax
-import Text.Parsers.ProtocolA (documentParser)
-import Text.Parsers.ProtocolA.Data (ProtocolAItem (..))
-import Text.Parsers.ProtocolA.Types
+import LysKom.ProtocolA (documentParser)
+import LysKom.ProtocolA.Data (ProtocolAItem (..))
+import LysKom.ProtocolA.Types
 import Text.ParserCombinators.Parsec (parseFromFile)
 
 import Data.Either (rights)
@@ -15,7 +15,7 @@ import Data.Maybe (maybe)
 
 import Control.Concurrent.Async (Async)
 
-import LineFormat
+import LysKom.LineFormat
 import Data.Int
 
 -- typename "sparse-block" ⇒ "SparseBlock"
diff --git a/LineFormat.lhs b/LysKom/LineFormat.lhs
similarity index 98%
rename from LineFormat.lhs
rename to LysKom/LineFormat.lhs
index de6fda6..9975e4c 100644
--- a/LineFormat.lhs
+++ b/LysKom/LineFormat.lhs
@@ -7,7 +7,7 @@
 -- Direct string s for \emph{both} ByteString.Builder and Attoparsec
 {-# LANGUAGE OverloadedStrings #-}
 
-module LineFormat where
+module LysKom.LineFormat where
 
 import Data.ByteString.Builder
 import qualified Data.ByteString.Lazy as BS
diff --git a/Text/Parsers/ProtocolA.lhs b/LysKom/ProtocolA.lhs
similarity index 93%
rename from Text/Parsers/ProtocolA.lhs
rename to LysKom/ProtocolA.lhs
index 2fb3cdc..203c729 100644
--- a/Text/Parsers/ProtocolA.lhs
+++ b/LysKom/ProtocolA.lhs
@@ -1,15 +1,15 @@
 \begin{code}
-module Text.Parsers.ProtocolA where
+module LysKom.ProtocolA where
 
 \end{code}
 
 \begin{comment}
 \begin{code}
 import Text.ParserCombinators.Parsec
-import Text.Parsers.Helpers
-import Text.Parsers.ProtocolA.Types
-import Text.Parsers.ProtocolA.Data (ProtocolAItem(..))
-import Text.Parsers.ProtocolA.Requests
+import LysKom.ProtocolA.Helpers
+import LysKom.ProtocolA.Types
+import LysKom.ProtocolA.Data (ProtocolAItem(..))
+import LysKom.ProtocolA.Requests
 \end{code}
 \end{comment}
 
diff --git a/Text/Parsers/ProtocolA/Data.lhs b/LysKom/ProtocolA/Data.lhs
similarity index 91%
rename from Text/Parsers/ProtocolA/Data.lhs
rename to LysKom/ProtocolA/Data.lhs
index 7715eeb..dfe8976 100644
--- a/Text/Parsers/ProtocolA/Data.lhs
+++ b/LysKom/ProtocolA/Data.lhs
@@ -1,10 +1,10 @@
 \begin{code}
-module Text.Parsers.ProtocolA.Data where
+module LysKom.ProtocolA.Data where
 \end{code}
 
 \begin{comment}
 \begin{code}
-import Text.Parsers.ProtocolA.Types (LysType(..))
+import LysKom.ProtocolA.Types (LysType(..))
 \end{code}
 \end{comment}
 
diff --git a/Text/Parsers/Helpers.lhs b/LysKom/ProtocolA/Helpers.lhs
similarity index 97%
rename from Text/Parsers/Helpers.lhs
rename to LysKom/ProtocolA/Helpers.lhs
index 3d32ce8..820ff72 100644
--- a/Text/Parsers/Helpers.lhs
+++ b/LysKom/ProtocolA/Helpers.lhs
@@ -1,6 +1,6 @@
 \begin{comment}
 \begin{code}
-module Text.Parsers.Helpers where
+module LysKom.ProtocolA.Helpers where
 
 import Text.ParserCombinators.Parsec
 \end{code}
diff --git a/Text/Parsers/ProtocolA/Requests.lhs b/LysKom/ProtocolA/Requests.lhs
similarity index 89%
rename from Text/Parsers/ProtocolA/Requests.lhs
rename to LysKom/ProtocolA/Requests.lhs
index 06a7fce..c11b37c 100644
--- a/Text/Parsers/ProtocolA/Requests.lhs
+++ b/LysKom/ProtocolA/Requests.lhs
@@ -2,15 +2,15 @@
 \label{item:rpc}
 
 \begin{code}
-module Text.Parsers.ProtocolA.Requests where
+module LysKom.ProtocolA.Requests where
 \end{code}
 
 \begin{comment}
 \begin{code}
 import Text.ParserCombinators.Parsec
-import Text.Parsers.Helpers
-import Text.Parsers.ProtocolA.Types
-import Text.Parsers.ProtocolA.Data (ProtocolAItem(Async,Request))
+import LysKom.ProtocolA.Helpers
+import LysKom.ProtocolA.Types
+import LysKom.ProtocolA.Data (ProtocolAItem(Async,Request))
 \end{code}
 \end{comment}
 
diff --git a/Text/Parsers/ProtocolA/Types.lhs b/LysKom/ProtocolA/Types.lhs
similarity index 98%
rename from Text/Parsers/ProtocolA/Types.lhs
rename to LysKom/ProtocolA/Types.lhs
index fb38723..8102260 100644
--- a/Text/Parsers/ProtocolA/Types.lhs
+++ b/LysKom/ProtocolA/Types.lhs
@@ -1,13 +1,13 @@
 \section{Types}
 
 \begin{code}
-module Text.Parsers.ProtocolA.Types where
+module LysKom.ProtocolA.Types where
 \end{code}
 
 \begin{comment}
 \begin{code}
 import Text.ParserCombinators.Parsec
-import Text.Parsers.Helpers
+import LysKom.ProtocolA.Helpers
 import Data.Functor ((<&>), ($>))
 \end{code}
 \end{comment}
diff --git a/LysKom/Types.hs b/LysKom/Types.hs
new file mode 100644
index 0000000..f525a30
--- /dev/null
+++ b/LysKom/Types.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Output where
+
+import LineFormat
+import LysKom
+
+import GHC.Base
+import GHC.Int (Int8, Int16, Int32)
+import GHC.Show
+import GHC.Types (Bool, Float)
+import Data.List (intersperse)
+import Data.ByteString.Builder (char7, intDec)
+import Data.ByteString.Char8 (pack)
+import Data.Functor ((<$>))
+import Data.Either
+
+import Data.Attoparsec.ByteString (choice)
+import Data.Attoparsec.ByteString.Char8 (char, string)
+
+--------------------------------------------------
+
+import Test2 (f)
+import Language.Haskell.TH (runQ, runIO)
+import Text.Parsers.ProtocolA (documentParser)
+import Text.ParserCombinators.Parsec (parseFromFile)
+
+$(do d <- runIO $ parseFromFile documentParser "/usr/share/doc/lyskom/protocol-a-full.txt"
+     let dat = head $ rights [d]
+     (mconcat <$>) $ Prelude.mapM runQ $ map f dat)
diff --git a/doc/main.tex b/doc/main.tex
index 173bd88..539150c 100644
--- a/doc/main.tex
+++ b/doc/main.tex
@@ -61,10 +61,10 @@ variant of ASN.1 (Abstract Syntax Notation One) which was used is slightly non-s
 See appendix~\ref{app:ast} for sample output for all parsers defined in this
 chapter.
 
-\input{lhs/Text/Parsers/ProtocolA/Data.lhs}
-\input{lhs/Text/Parsers/ProtocolA.lhs}
-\input{lhs/Text/Parsers/ProtocolA/Types.lhs}
-\input{lhs/Text/Parsers/ProtocolA/Requests.lhs}
+\input{lhs/LysKom/ProtocolA/Data.lhs}
+\input{lhs/LysKom/ProtocolA.lhs}
+\input{lhs/LysKom/ProtocolA/Types.lhs}
+\input{lhs/LysKom/ProtocolA/Requests.lhs}
 
 \chapter {From AST to Haskell}
 \label{cha:asthaskell}
@@ -95,7 +95,7 @@ Haskell code from it. Now we start actually looking towards actual data!
 We need some extra functions for making everything else go together.
 This includes extra parsers, a main method, and code for other things.
 
-\input{lhs/Text/Parsers/Helpers.lhs}
+\input{lhs/LysKom/ProtocolA/Helpers.lhs}
 
 \chapter {AST examples}
 \label{app:ast}
-- 
GitLab