module Language.Drasil.Code.DataDesc where
import Language.Drasil.Chunk.Code (CodeVarChunk)
import Data.List (nub)
import Data.List.NonEmpty (NonEmpty(..), fromList)
type DataItem = CodeVarChunk
data DataDesc' = DD Data' Delimiter DataDesc' | End Data'
data Data' = Datum DataItem'
| Data
(NonEmpty DataItem')
Integer
Delimiter
| Junk
data DataItem' = DI
CodeVarChunk
[Delimiter]
type Delimiter = String
dataDesc :: [Data'] -> Delimiter -> DataDesc'
dataDesc :: [Data'] -> Delimiter -> DataDesc'
dataDesc [d :: Data'
d] _ = Data' -> DataDesc'
End Data'
d
dataDesc (d :: Data'
d:ds :: [Data']
ds) dlm :: Delimiter
dlm = Data' -> Delimiter -> DataDesc' -> DataDesc'
DD Data'
d Delimiter
dlm ([Data'] -> Delimiter -> DataDesc'
dataDesc [Data']
ds Delimiter
dlm)
dataDesc [] _ = Delimiter -> DataDesc'
forall a. HasCallStack => Delimiter -> a
error "DataDesc must have at least one data item"
singleton' :: CodeVarChunk -> Data'
singleton' :: CodeVarChunk -> Data'
singleton' d :: CodeVarChunk
d = DataItem' -> Data'
Datum (DataItem' -> Data') -> DataItem' -> Data'
forall a b. (a -> b) -> a -> b
$ CodeVarChunk -> [Delimiter] -> DataItem'
DI CodeVarChunk
d []
list :: CodeVarChunk -> [Delimiter] -> Data'
list :: CodeVarChunk -> [Delimiter] -> Data'
list d :: CodeVarChunk
d dlms :: [Delimiter]
dlms = DataItem' -> Data'
Datum (DataItem' -> Data') -> DataItem' -> Data'
forall a b. (a -> b) -> a -> b
$ CodeVarChunk -> [Delimiter] -> DataItem'
DI CodeVarChunk
d [Delimiter]
dlms
interwovenLists :: [DataItem'] -> Integer -> Delimiter -> Data'
interwovenLists :: [DataItem'] -> Integer -> Delimiter -> Data'
interwovenLists [] _ _ = Delimiter -> Data'
forall a. HasCallStack => Delimiter -> a
error "interwovenLists must be passed a non-empty list"
interwovenLists ds :: [DataItem']
ds i :: Integer
i dl :: Delimiter
dl = NonEmpty DataItem' -> Integer -> Delimiter -> Data'
Data ([DataItem'] -> NonEmpty DataItem'
forall a. [a] -> NonEmpty a
fromList [DataItem']
ds) Integer
i Delimiter
dl
junk :: Data'
junk :: Data'
junk = Data'
Junk
type DataDesc = [Data]
type Delim = Char
data Data = Singleton DataItem
| JunkData
| Line LinePattern Delim
| Lines LinePattern (Maybe Integer) Delim
data LinePattern = Straight [DataItem]
| Repeat [DataItem]
singleton :: DataItem -> Data
singleton :: CodeVarChunk -> Data
singleton = CodeVarChunk -> Data
Singleton
junkLine :: Data
junkLine :: Data
junkLine = Data
JunkData
singleLine :: LinePattern -> Delim -> Data
singleLine :: LinePattern -> Delim -> Data
singleLine = LinePattern -> Delim -> Data
Line
multiLine :: LinePattern -> Delim -> Data
multiLine :: LinePattern -> Delim -> Data
multiLine l :: LinePattern
l = LinePattern -> Maybe Integer -> Delim -> Data
Lines LinePattern
l Maybe Integer
forall a. Maybe a
Nothing
multiLine' :: LinePattern -> Integer -> Delim -> Data
multiLine' :: LinePattern -> Integer -> Delim -> Data
multiLine' l :: LinePattern
l i :: Integer
i = LinePattern -> Maybe Integer -> Delim -> Data
Lines LinePattern
l (Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
i)
straight :: [DataItem] -> LinePattern
straight :: [CodeVarChunk] -> LinePattern
straight = [CodeVarChunk] -> LinePattern
Straight
repeated :: [DataItem] -> LinePattern
repeated :: [CodeVarChunk] -> LinePattern
repeated = [CodeVarChunk] -> LinePattern
Repeat
isJunk :: Data -> Bool
isJunk :: Data -> Bool
isJunk JunkData = Bool
True
isJunk _ = Bool
False
isLine :: Data -> Bool
isLine :: Data -> Bool
isLine Line{} = Bool
True
isLine _ = Bool
False
isLines :: Data -> Bool
isLines :: Data -> Bool
isLines Lines{} = Bool
True
isLines _ = Bool
False
getInputs :: DataDesc -> [DataItem]
getInputs :: DataDesc -> [CodeVarChunk]
getInputs d :: DataDesc
d = [CodeVarChunk] -> [CodeVarChunk]
forall a. Eq a => [a] -> [a]
nub ([CodeVarChunk] -> [CodeVarChunk])
-> [CodeVarChunk] -> [CodeVarChunk]
forall a b. (a -> b) -> a -> b
$ (Data -> [CodeVarChunk]) -> DataDesc -> [CodeVarChunk]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Data -> [CodeVarChunk]
getDataInputs DataDesc
d
getDataInputs :: Data -> [DataItem]
getDataInputs :: Data -> [CodeVarChunk]
getDataInputs (Singleton v :: CodeVarChunk
v) = [CodeVarChunk
v]
getDataInputs (Line lp :: LinePattern
lp _) = LinePattern -> [CodeVarChunk]
getPatternInputs LinePattern
lp
getDataInputs (Lines lp :: LinePattern
lp _ _) = LinePattern -> [CodeVarChunk]
getPatternInputs LinePattern
lp
getDataInputs JunkData = []
getPatternInputs :: LinePattern -> [DataItem]
getPatternInputs :: LinePattern -> [CodeVarChunk]
getPatternInputs (Straight vs :: [CodeVarChunk]
vs) = [CodeVarChunk]
vs
getPatternInputs (Repeat vs :: [CodeVarChunk]
vs) = [CodeVarChunk]
vs