-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A CSV toolkit based on cassava and enum-text -- -- Please see the README on GitHub at -- https://github.com/cdornan/columnar#readme @package columnar @version 1.0.0.0 module Text.Columnar -- | a columnar type enumerates the columns of a CSV/table; it is just an -- EnumText with options for CSV codecs and the table generators class EnumText c => Columnar c columnOptions :: Columnar c => ColumnOptions c data ColumnOptions c ColumnOptions :: IsNamed -> EncodeOptions -> DecodeOptions -> WithColHeader -> (RowNo -> c -> Builder -> Builder) -> ColumnOptions c -- | encoding CSV with headers? [_co_csv_nmd] :: ColumnOptions c -> IsNamed -- | Cassava encode options [_co_csv_eos] :: ColumnOptions c -> EncodeOptions -- | Cassava decode options [_co_csv_dos] :: ColumnOptions c -> DecodeOptions -- | teabular: include a header line [_co_col_hdr] :: ColumnOptions c -> WithColHeader -- | teabular: field formatters [_co_col_fmt] :: ColumnOptions c -> RowNo -> c -> Builder -> Builder -- | are we generating/expecting a header for CSVs data IsNamed -- | we are generating and expecting headers Named :: IsNamed -- | we are not generating headers but possibly skipping them on read Positional :: HasHeader -> IsNamed -- | are we generating/expecting a header for tabular data data WithColHeader WithColHeader :: WithColHeader WithoutColHeader :: WithColHeader -- | which Row is being formatted newtype RowNo RowNo :: Int -> RowNo [_RowNo] :: RowNo -> Int -- | the header is row 0, first data row is 1 headerRowNo :: RowNo -- | the header is row 0, first data row is 1 firstRowNo :: RowNo -- | the list of valid RowNo, starting with the first row (NOT the header) rowNoSupply :: [RowNo] defaultPositionalColumnOptions :: ColumnOptions c defaultColumnOptions :: ColumnOptions c -- | IsRecord combines the column type with the record type, each record -- type determining the column type and vice versa class Columnar c => IsRecord r c | r -> c, c -> r zeroRecord :: IsRecord r c => r fieldMethods :: IsRecord r c => c -> FieldMethods r c -- | IsRecord combines the column type with the record type, each record -- type determining the column type and vice versa class (Monoid r, IsRecord r c) => IsMonoidalRecord r c monoidalFieldMethods :: IsMonoidalRecord r c => c -> MonoidalFieldMethods r c -- | for each column we need a lens the field of the record, which must be -- Buildable and TextParsable data FieldMethods r c FieldMethods :: Lens' r f -> FieldMethods r c [_fm_lens] :: FieldMethods r c -> Lens' r f -- | if we need monoidal records then the fields must be Monoidal too. data MonoidalFieldMethods r c MonoidalFieldMethods :: Lens' r f -> MonoidalFieldMethods r c [_mfm_lens] :: MonoidalFieldMethods r c -> Lens' r f -- | a record set contains the ColumnOptions along with the vector of -- records data Records r c Records :: ColumnOptions c -> Vector r -> Records r c [_recs_options] :: Records r c -> ColumnOptions c [_recs_vector] :: Records r c -> Vector r class (IsRecord r c, Coercible m (IntMap r)) => IsRecordIntMap r c m | r -> c, c -> r, r -> m, m -> r recordKey :: IsRecordIntMap r c m => r -> Int -- | encoding to an Intmap encodeRecordMap :: forall r c m. IsRecordIntMap r c m => m -> ByteString -- | decoding into an Intmap decodeRecordMap :: forall r c m. IsRecordIntMap r c m => ByteString -> Possibly m -- | often we will want to construct a Monoid Intmap from Monoid records memptyRecordMap :: forall r c m. (Monoid r, IsRecordIntMap r c m) => m -- | often we will want to construct a Monoid Intmap from Monoid records mappendRecordMap :: forall r c m. (Monoid r, IsRecordIntMap r c m) => m -> m -> m -- | provide evidence that Map is well formed summarizeMap :: forall r c m. IsRecordIntMap r c m => m -> Text class (IsRecord r c, Coercible m (HashMap Text r)) => IsRecordHashMap r c m | r -> c, c -> r, r -> m, m -> r recordTextKey :: IsRecordHashMap r c m => r -> Text -- | encoding to an Intmap encodeRecordHashMap :: forall r c m. IsRecordHashMap r c m => m -> ByteString -- | decoding into an Intmap decodeRecordHashMap :: forall r c m. IsRecordHashMap r c m => ByteString -> Possibly m -- | often we will want to construct a Monoid HashMap from Monoid records memptyRecordHashMap :: forall r c m. (Monoid r, IsRecordHashMap r c m) => m -- | often we will want to construct a Monoid HashMap from Monoid records mappendRecordHashMap :: forall r c m. (Monoid r, IsRecordHashMap r c m) => m -> m -> m -- | provide evidence that HashMap is well formed summarizeHashMap :: forall r c m. IsRecordHashMap r c m => m -> Text newtype Row c Row :: (c -> Builder) -> Row c [_Row] :: Row c -> c -> Builder -- | Rows are used for generating tabular output and do not need access to -- any record type data Rows c Rows :: ColumnOptions c -> Vector (Row c) -> Rows c [_rows_options] :: Rows c -> ColumnOptions c [_rows_vector] :: Rows c -> Vector (Row c) mkRows :: Columnar c => [Row c] -> Rows c mkRowsWith :: ColumnOptions c -> [Row c] -> Rows c getRows :: Rows c -> [Row c] mkRow :: (c -> Builder) -> Row c -- | sometimes we just need the column type, as with listColumns data ColumnarIx c ColumnarIx :: ColumnarIx c listColumns :: Columnar c => ColumnarIx c -> [c] -- | for constructing each field's FieldMethods mkFieldMethods :: (TextParsable f, Buildable f) => Lens' r f -> FieldMethods r c -- | for constructing each field's MonoidalFieldMethods mkMonoidalFieldMethods :: (TextParsable f, Buildable f, Monoid f) => Lens' r f -> MonoidalFieldMethods r c convertMonoidalFieldMethodsToFieldMethods :: MonoidalFieldMethods r c -> FieldMethods r c constructRecordMappend :: (Bounded c, Enum c) => (c -> MonoidalFieldMethods r c) -> r -> r -> r -- | encode the list of records as a Haskell list of strings, one line per -- line, indented at two spaces haskellRecords :: IsRecord r c => [r] -> Builder mkRecords :: Columnar c => [r] -> Records r c mkRecordsWith :: ColumnOptions c -> [r] -> Records r c buildRecord :: forall r c. IsRecord r c => r -> Builder encodeRecordsT :: forall r c. IsRecord r c => Records r c -> Text encodeRecords :: forall r c. IsRecord r c => Records r c -> ByteString decodeRecordsT :: IsRecord r c => Text -> Possibly (Records r c) decodeRecords :: IsRecord r c => ByteString -> Possibly (Records r c) parseRecord :: IsRecord r c => TextParser r decodeRecordsWithT :: IsRecord r c => ColumnOptions c -> Text -> Possibly (Records r c) decodeRecordsWith :: IsRecord r c => ColumnOptions c -> ByteString -> Possibly (Records r c) recordsToRows :: IsRecord r c => Records r c -> Rows c recordToRow :: IsRecord r c => r -> Row c rowsToRecords :: forall r c. IsRecord r c => Rows c -> Possibly (Records r c) rowToRecord :: forall r c. IsRecord r c => Row c -> Possibly r encodeColumnarCsv :: forall c. Columnar c => Rows c -> ByteString csvHeader :: Columnar c => ColumnarIx c -> Header decodeColumnarCsv :: Columnar c => ByteString -> Possibly (Rows c) decodeColumnarCsvWith :: Columnar c => ColumnOptions c -> ByteString -> Possibly (Rows c) recordFields :: forall r c. IsRecord r c => [(ByteString, r -> ByteString)] listRecords :: Columnar c => Records r c -> [r] mkNamedRecord :: [(ByteString, a -> ByteString)] -> a -> NamedRecord mkIntMap :: (a -> Int) -> [a] -> IntMap a