module CSV () where

-- | Using LiquidHaskell for CSV lists
-- c.f. http://www.reddit.com/r/scala/comments/1nhzi2/using_shapelesss_sized_type_to_eliminate_real/

data CSV = Csv { headers :: [String]
               , rows    :: [[String]]
               }

{-@ data CSV = Csv { headers :: [String]
                   , rows    :: [{v:[String] | (len v) = (len headers)}]
                   }
  @-}

-- Eeks, we missed the column name.

csvBad1 = Csv ["Date"] 
              [ ["Mon", "1"]
              , ["Tue", "2"]
              , ["Wed", "3"] 
              ]

-- Eeks, we missed a column.

csvBad2 = Csv ["Name", "Age"] 
              [ ["Alice", "32"]
              , ["Bob"        ]
              , ["Cris" , "29"] 
              ]
                      
-- All is well! 

csvGood = Csv ["Id", "Name", "Days"]
              [ ["1", "Jan", "31"]
              , ["2", "Feb", "28"]
              , ["3", "Mar", "31"]
              , ["4", "Apr", "30"] 
              ]
