-- | A simple, untyped tabular data model, suitable for CSVs and TSVs

module Hydra.Langs.Tabular where

import qualified Hydra.Core as Core
import Data.Int
import Data.List as L
import Data.Map as M
import Data.Set as S

-- | A data row, containing optional-valued cells; one per column
newtype DataRow v = 
  DataRow {
    forall v. DataRow v -> [Maybe v]
unDataRow :: [Maybe v]}
  deriving (DataRow v -> DataRow v -> Bool
(DataRow v -> DataRow v -> Bool)
-> (DataRow v -> DataRow v -> Bool) -> Eq (DataRow v)
forall v. Eq v => DataRow v -> DataRow v -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall v. Eq v => DataRow v -> DataRow v -> Bool
== :: DataRow v -> DataRow v -> Bool
$c/= :: forall v. Eq v => DataRow v -> DataRow v -> Bool
/= :: DataRow v -> DataRow v -> Bool
Eq, Eq (DataRow v)
Eq (DataRow v) =>
(DataRow v -> DataRow v -> Ordering)
-> (DataRow v -> DataRow v -> Bool)
-> (DataRow v -> DataRow v -> Bool)
-> (DataRow v -> DataRow v -> Bool)
-> (DataRow v -> DataRow v -> Bool)
-> (DataRow v -> DataRow v -> DataRow v)
-> (DataRow v -> DataRow v -> DataRow v)
-> Ord (DataRow v)
DataRow v -> DataRow v -> Bool
DataRow v -> DataRow v -> Ordering
DataRow v -> DataRow v -> DataRow v
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall v. Ord v => Eq (DataRow v)
forall v. Ord v => DataRow v -> DataRow v -> Bool
forall v. Ord v => DataRow v -> DataRow v -> Ordering
forall v. Ord v => DataRow v -> DataRow v -> DataRow v
$ccompare :: forall v. Ord v => DataRow v -> DataRow v -> Ordering
compare :: DataRow v -> DataRow v -> Ordering
$c< :: forall v. Ord v => DataRow v -> DataRow v -> Bool
< :: DataRow v -> DataRow v -> Bool
$c<= :: forall v. Ord v => DataRow v -> DataRow v -> Bool
<= :: DataRow v -> DataRow v -> Bool
$c> :: forall v. Ord v => DataRow v -> DataRow v -> Bool
> :: DataRow v -> DataRow v -> Bool
$c>= :: forall v. Ord v => DataRow v -> DataRow v -> Bool
>= :: DataRow v -> DataRow v -> Bool
$cmax :: forall v. Ord v => DataRow v -> DataRow v -> DataRow v
max :: DataRow v -> DataRow v -> DataRow v
$cmin :: forall v. Ord v => DataRow v -> DataRow v -> DataRow v
min :: DataRow v -> DataRow v -> DataRow v
Ord, ReadPrec [DataRow v]
ReadPrec (DataRow v)
Int -> ReadS (DataRow v)
ReadS [DataRow v]
(Int -> ReadS (DataRow v))
-> ReadS [DataRow v]
-> ReadPrec (DataRow v)
-> ReadPrec [DataRow v]
-> Read (DataRow v)
forall v. Read v => ReadPrec [DataRow v]
forall v. Read v => ReadPrec (DataRow v)
forall v. Read v => Int -> ReadS (DataRow v)
forall v. Read v => ReadS [DataRow v]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall v. Read v => Int -> ReadS (DataRow v)
readsPrec :: Int -> ReadS (DataRow v)
$creadList :: forall v. Read v => ReadS [DataRow v]
readList :: ReadS [DataRow v]
$creadPrec :: forall v. Read v => ReadPrec (DataRow v)
readPrec :: ReadPrec (DataRow v)
$creadListPrec :: forall v. Read v => ReadPrec [DataRow v]
readListPrec :: ReadPrec [DataRow v]
Read, Int -> DataRow v -> ShowS
[DataRow v] -> ShowS
DataRow v -> String
(Int -> DataRow v -> ShowS)
-> (DataRow v -> String)
-> ([DataRow v] -> ShowS)
-> Show (DataRow v)
forall v. Show v => Int -> DataRow v -> ShowS
forall v. Show v => [DataRow v] -> ShowS
forall v. Show v => DataRow v -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall v. Show v => Int -> DataRow v -> ShowS
showsPrec :: Int -> DataRow v -> ShowS
$cshow :: forall v. Show v => DataRow v -> String
show :: DataRow v -> String
$cshowList :: forall v. Show v => [DataRow v] -> ShowS
showList :: [DataRow v] -> ShowS
Show)

_DataRow :: Name
_DataRow = (String -> Name
Core.Name String
"hydra/langs/tabular.DataRow")

-- | A header row, containing column names (but no types or data)
newtype HeaderRow = 
  HeaderRow {
    HeaderRow -> [String]
unHeaderRow :: [String]}
  deriving (HeaderRow -> HeaderRow -> Bool
(HeaderRow -> HeaderRow -> Bool)
-> (HeaderRow -> HeaderRow -> Bool) -> Eq HeaderRow
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: HeaderRow -> HeaderRow -> Bool
== :: HeaderRow -> HeaderRow -> Bool
$c/= :: HeaderRow -> HeaderRow -> Bool
/= :: HeaderRow -> HeaderRow -> Bool
Eq, Eq HeaderRow
Eq HeaderRow =>
(HeaderRow -> HeaderRow -> Ordering)
-> (HeaderRow -> HeaderRow -> Bool)
-> (HeaderRow -> HeaderRow -> Bool)
-> (HeaderRow -> HeaderRow -> Bool)
-> (HeaderRow -> HeaderRow -> Bool)
-> (HeaderRow -> HeaderRow -> HeaderRow)
-> (HeaderRow -> HeaderRow -> HeaderRow)
-> Ord HeaderRow
HeaderRow -> HeaderRow -> Bool
HeaderRow -> HeaderRow -> Ordering
HeaderRow -> HeaderRow -> HeaderRow
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: HeaderRow -> HeaderRow -> Ordering
compare :: HeaderRow -> HeaderRow -> Ordering
$c< :: HeaderRow -> HeaderRow -> Bool
< :: HeaderRow -> HeaderRow -> Bool
$c<= :: HeaderRow -> HeaderRow -> Bool
<= :: HeaderRow -> HeaderRow -> Bool
$c> :: HeaderRow -> HeaderRow -> Bool
> :: HeaderRow -> HeaderRow -> Bool
$c>= :: HeaderRow -> HeaderRow -> Bool
>= :: HeaderRow -> HeaderRow -> Bool
$cmax :: HeaderRow -> HeaderRow -> HeaderRow
max :: HeaderRow -> HeaderRow -> HeaderRow
$cmin :: HeaderRow -> HeaderRow -> HeaderRow
min :: HeaderRow -> HeaderRow -> HeaderRow
Ord, ReadPrec [HeaderRow]
ReadPrec HeaderRow
Int -> ReadS HeaderRow
ReadS [HeaderRow]
(Int -> ReadS HeaderRow)
-> ReadS [HeaderRow]
-> ReadPrec HeaderRow
-> ReadPrec [HeaderRow]
-> Read HeaderRow
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS HeaderRow
readsPrec :: Int -> ReadS HeaderRow
$creadList :: ReadS [HeaderRow]
readList :: ReadS [HeaderRow]
$creadPrec :: ReadPrec HeaderRow
readPrec :: ReadPrec HeaderRow
$creadListPrec :: ReadPrec [HeaderRow]
readListPrec :: ReadPrec [HeaderRow]
Read, Int -> HeaderRow -> ShowS
[HeaderRow] -> ShowS
HeaderRow -> String
(Int -> HeaderRow -> ShowS)
-> (HeaderRow -> String)
-> ([HeaderRow] -> ShowS)
-> Show HeaderRow
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> HeaderRow -> ShowS
showsPrec :: Int -> HeaderRow -> ShowS
$cshow :: HeaderRow -> String
show :: HeaderRow -> String
$cshowList :: [HeaderRow] -> ShowS
showList :: [HeaderRow] -> ShowS
Show)

_HeaderRow :: Name
_HeaderRow = (String -> Name
Core.Name String
"hydra/langs/tabular.HeaderRow")

-- | A simple table as in a CSV file, having an optional header row and any number of data rows
data Table v = 
  Table {
    -- | The optional header row of the table. If present, the header must have the same number of cells as each data row.
    forall v. Table v -> Maybe HeaderRow
tableHeader :: (Maybe HeaderRow),
    -- | The data rows of the table. Each row must have the same number of cells.
    forall v. Table v -> [DataRow v]
tableData :: [DataRow v]}
  deriving (Table v -> Table v -> Bool
(Table v -> Table v -> Bool)
-> (Table v -> Table v -> Bool) -> Eq (Table v)
forall v. Eq v => Table v -> Table v -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall v. Eq v => Table v -> Table v -> Bool
== :: Table v -> Table v -> Bool
$c/= :: forall v. Eq v => Table v -> Table v -> Bool
/= :: Table v -> Table v -> Bool
Eq, Eq (Table v)
Eq (Table v) =>
(Table v -> Table v -> Ordering)
-> (Table v -> Table v -> Bool)
-> (Table v -> Table v -> Bool)
-> (Table v -> Table v -> Bool)
-> (Table v -> Table v -> Bool)
-> (Table v -> Table v -> Table v)
-> (Table v -> Table v -> Table v)
-> Ord (Table v)
Table v -> Table v -> Bool
Table v -> Table v -> Ordering
Table v -> Table v -> Table v
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall v. Ord v => Eq (Table v)
forall v. Ord v => Table v -> Table v -> Bool
forall v. Ord v => Table v -> Table v -> Ordering
forall v. Ord v => Table v -> Table v -> Table v
$ccompare :: forall v. Ord v => Table v -> Table v -> Ordering
compare :: Table v -> Table v -> Ordering
$c< :: forall v. Ord v => Table v -> Table v -> Bool
< :: Table v -> Table v -> Bool
$c<= :: forall v. Ord v => Table v -> Table v -> Bool
<= :: Table v -> Table v -> Bool
$c> :: forall v. Ord v => Table v -> Table v -> Bool
> :: Table v -> Table v -> Bool
$c>= :: forall v. Ord v => Table v -> Table v -> Bool
>= :: Table v -> Table v -> Bool
$cmax :: forall v. Ord v => Table v -> Table v -> Table v
max :: Table v -> Table v -> Table v
$cmin :: forall v. Ord v => Table v -> Table v -> Table v
min :: Table v -> Table v -> Table v
Ord, ReadPrec [Table v]
ReadPrec (Table v)
Int -> ReadS (Table v)
ReadS [Table v]
(Int -> ReadS (Table v))
-> ReadS [Table v]
-> ReadPrec (Table v)
-> ReadPrec [Table v]
-> Read (Table v)
forall v. Read v => ReadPrec [Table v]
forall v. Read v => ReadPrec (Table v)
forall v. Read v => Int -> ReadS (Table v)
forall v. Read v => ReadS [Table v]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall v. Read v => Int -> ReadS (Table v)
readsPrec :: Int -> ReadS (Table v)
$creadList :: forall v. Read v => ReadS [Table v]
readList :: ReadS [Table v]
$creadPrec :: forall v. Read v => ReadPrec (Table v)
readPrec :: ReadPrec (Table v)
$creadListPrec :: forall v. Read v => ReadPrec [Table v]
readListPrec :: ReadPrec [Table v]
Read, Int -> Table v -> ShowS
[Table v] -> ShowS
Table v -> String
(Int -> Table v -> ShowS)
-> (Table v -> String) -> ([Table v] -> ShowS) -> Show (Table v)
forall v. Show v => Int -> Table v -> ShowS
forall v. Show v => [Table v] -> ShowS
forall v. Show v => Table v -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall v. Show v => Int -> Table v -> ShowS
showsPrec :: Int -> Table v -> ShowS
$cshow :: forall v. Show v => Table v -> String
show :: Table v -> String
$cshowList :: forall v. Show v => [Table v] -> ShowS
showList :: [Table v] -> ShowS
Show)

_Table :: Name
_Table = (String -> Name
Core.Name String
"hydra/langs/tabular.Table")

_Table_header :: Name
_Table_header = (String -> Name
Core.Name String
"header")

_Table_data :: Name
_Table_data = (String -> Name
Core.Name String
"data")