{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module DataFrame.Operations.Typing where
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Data.Vector as V
import Control.Applicative (asum)
import Control.Monad (join)
import Data.Maybe (fromMaybe)
import qualified Data.Proxy as P
import Data.Time
import Data.Type.Equality (TestEquality (..))
import DataFrame.Internal.Column (Column (..), fromVector)
import DataFrame.Internal.DataFrame (DataFrame (..), unsafeGetColumn)
import DataFrame.Internal.Parsing
import DataFrame.Internal.Schema
import DataFrame.Operations.Core
import Text.Read
import Type.Reflection
type DateFormat = String
data ParseOptions = ParseOptions
{ ParseOptions -> [Text]
missingValues :: [T.Text]
, ParseOptions -> Int
sampleSize :: Int
, ParseOptions -> Bool
parseSafe :: Bool
, ParseOptions -> DateFormat
parseDateFormat :: DateFormat
}
defaultParseOptions :: ParseOptions
defaultParseOptions :: ParseOptions
defaultParseOptions =
ParseOptions
{ missingValues :: [Text]
missingValues = []
, sampleSize :: Int
sampleSize = Int
100
, parseSafe :: Bool
parseSafe = Bool
True
, parseDateFormat :: DateFormat
parseDateFormat = DateFormat
"%Y-%m-%d"
}
parseDefaults :: ParseOptions -> DataFrame -> DataFrame
parseDefaults :: ParseOptions -> DataFrame -> DataFrame
parseDefaults ParseOptions
opts DataFrame
df = DataFrame
df{columns = V.map (parseDefault opts) (columns df)}
parseDefault :: ParseOptions -> Column -> Column
parseDefault :: ParseOptions -> Column -> Column
parseDefault ParseOptions
opts (BoxedColumn (Vector a
c :: V.Vector a)) =
case (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) TypeRep a -> TypeRep Text -> Maybe (a :~: Text)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
`testEquality` (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @T.Text) of
Maybe (a :~: Text)
Nothing -> case (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) TypeRep a -> TypeRep DateFormat -> Maybe (a :~: DateFormat)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
`testEquality` (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @String) of
Just a :~: DateFormat
Refl -> ParseOptions -> Vector Text -> Column
parseFromExamples ParseOptions
opts ((DateFormat -> Text) -> Vector DateFormat -> Vector Text
forall a b. (a -> b) -> Vector a -> Vector b
V.map DateFormat -> Text
T.pack Vector a
Vector DateFormat
c)
Maybe (a :~: DateFormat)
Nothing -> Vector a -> Column
forall a. Columnable a => Vector a -> Column
BoxedColumn Vector a
c
Just a :~: Text
Refl -> ParseOptions -> Vector Text -> Column
parseFromExamples ParseOptions
opts Vector a
Vector Text
c
parseDefault ParseOptions
opts (OptionalColumn (Vector (Maybe a)
c :: V.Vector (Maybe a))) =
case (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) TypeRep a -> TypeRep Text -> Maybe (a :~: Text)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
`testEquality` (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @T.Text) of
Maybe (a :~: Text)
Nothing -> case (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) TypeRep a -> TypeRep DateFormat -> Maybe (a :~: DateFormat)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
`testEquality` (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @String) of
Just a :~: DateFormat
Refl ->
ParseOptions -> Vector Text -> Column
parseFromExamples ParseOptions
opts ((Maybe DateFormat -> Text)
-> Vector (Maybe DateFormat) -> Vector Text
forall a b. (a -> b) -> Vector a -> Vector b
V.map (DateFormat -> Text
T.pack (DateFormat -> Text)
-> (Maybe DateFormat -> DateFormat) -> Maybe DateFormat -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DateFormat -> Maybe DateFormat -> DateFormat
forall a. a -> Maybe a -> a
fromMaybe DateFormat
"") Vector (Maybe a)
Vector (Maybe DateFormat)
c)
Maybe (a :~: DateFormat)
Nothing -> Vector (Maybe a) -> Column
forall a. Columnable a => Vector a -> Column
BoxedColumn Vector (Maybe a)
c
Just a :~: Text
Refl -> ParseOptions -> Vector Text -> Column
parseFromExamples ParseOptions
opts ((Maybe Text -> Text) -> Vector (Maybe Text) -> Vector Text
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"") Vector (Maybe a)
Vector (Maybe Text)
c)
parseDefault ParseOptions
_ Column
column = Column
column
parseFromExamples :: ParseOptions -> V.Vector T.Text -> Column
parseFromExamples :: ParseOptions -> Vector Text -> Column
parseFromExamples ParseOptions
opts Vector Text
cols =
let
converter :: Text -> Maybe Text
converter =
if ParseOptions -> Bool
parseSafe ParseOptions
opts then [Text] -> Text -> Maybe Text
convertNullish (ParseOptions -> [Text]
missingValues ParseOptions
opts) else Text -> Maybe Text
convertOnlyEmpty
examples :: Vector (Maybe Text)
examples = (Text -> Maybe Text) -> Vector Text -> Vector (Maybe Text)
forall a b. (a -> b) -> Vector a -> Vector b
V.map Text -> Maybe Text
converter (Int -> Vector Text -> Vector Text
forall a. Int -> Vector a -> Vector a
V.take (ParseOptions -> Int
sampleSize ParseOptions
opts) Vector Text
cols)
asMaybeText :: Vector (Maybe Text)
asMaybeText = (Text -> Maybe Text) -> Vector Text -> Vector (Maybe Text)
forall a b. (a -> b) -> Vector a -> Vector b
V.map Text -> Maybe Text
converter Vector Text
cols
dfmt :: DateFormat
dfmt = ParseOptions -> DateFormat
parseDateFormat ParseOptions
opts
in
case DateFormat -> Vector (Maybe Text) -> ParsingAssumption
makeParsingAssumption DateFormat
dfmt Vector (Maybe Text)
examples of
ParsingAssumption
BoolAssumption -> Vector (Maybe Text) -> Column
handleBoolAssumption Vector (Maybe Text)
asMaybeText
ParsingAssumption
IntAssumption -> Vector (Maybe Text) -> Column
handleIntAssumption Vector (Maybe Text)
asMaybeText
ParsingAssumption
DoubleAssumption -> Vector (Maybe Text) -> Column
handleDoubleAssumption Vector (Maybe Text)
asMaybeText
ParsingAssumption
TextAssumption -> Vector (Maybe Text) -> Column
handleTextAssumption Vector (Maybe Text)
asMaybeText
ParsingAssumption
DateAssumption -> DateFormat -> Vector (Maybe Text) -> Column
handleDateAssumption DateFormat
dfmt Vector (Maybe Text)
asMaybeText
ParsingAssumption
NoAssumption -> DateFormat -> Vector (Maybe Text) -> Column
handleNoAssumption DateFormat
dfmt Vector (Maybe Text)
asMaybeText
handleBoolAssumption :: V.Vector (Maybe T.Text) -> Column
handleBoolAssumption :: Vector (Maybe Text) -> Column
handleBoolAssumption Vector (Maybe Text)
asMaybeText
| Bool
parsableAsBool =
Column -> (Vector Bool -> Column) -> Maybe (Vector Bool) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Bool) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Bool)
asMaybeBool) Vector Bool -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Bool) -> Maybe (Vector Bool)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Bool)
asMaybeBool)
| Bool
otherwise = Column -> (Vector Text -> Column) -> Maybe (Vector Text) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText) Vector Text -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Text) -> Maybe (Vector Text)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Text)
asMaybeText)
where
asMaybeBool :: Vector (Maybe Bool)
asMaybeBool = (Maybe Text -> Maybe Bool)
-> Vector (Maybe Text) -> Vector (Maybe Bool)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Bool) -> Maybe Bool
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Bool
Text -> Maybe Bool
readBool) Vector (Maybe Text)
asMaybeText
parsableAsBool :: Bool
parsableAsBool = Vector (Maybe Text) -> Vector (Maybe Bool) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Bool)
asMaybeBool
handleIntAssumption :: V.Vector (Maybe T.Text) -> Column
handleIntAssumption :: Vector (Maybe Text) -> Column
handleIntAssumption Vector (Maybe Text)
asMaybeText
| Bool
parsableAsInt =
Column -> (Vector Int -> Column) -> Maybe (Vector Int) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Int) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Int)
asMaybeInt) Vector Int -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Int) -> Maybe (Vector Int)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Int)
asMaybeInt)
| Bool
parsableAsDouble =
Column
-> (Vector Double -> Column) -> Maybe (Vector Double) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Double) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Double)
asMaybeDouble) Vector Double -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Double) -> Maybe (Vector Double)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Double)
asMaybeDouble)
| Bool
otherwise = Column -> (Vector Text -> Column) -> Maybe (Vector Text) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText) Vector Text -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Text) -> Maybe (Vector Text)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Text)
asMaybeText)
where
asMaybeInt :: Vector (Maybe Int)
asMaybeInt = (Maybe Text -> Maybe Int)
-> Vector (Maybe Text) -> Vector (Maybe Int)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Int
Text -> Maybe Int
readInt) Vector (Maybe Text)
asMaybeText
asMaybeDouble :: Vector (Maybe Double)
asMaybeDouble = (Maybe Text -> Maybe Double)
-> Vector (Maybe Text) -> Vector (Maybe Double)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Double
Text -> Maybe Double
readDouble) Vector (Maybe Text)
asMaybeText
parsableAsInt :: Bool
parsableAsInt =
Vector (Maybe Text) -> Vector (Maybe Int) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Int)
asMaybeInt
Bool -> Bool -> Bool
&& Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble
parsableAsDouble :: Bool
parsableAsDouble = Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble
handleDoubleAssumption :: V.Vector (Maybe T.Text) -> Column
handleDoubleAssumption :: Vector (Maybe Text) -> Column
handleDoubleAssumption Vector (Maybe Text)
asMaybeText
| Bool
parsableAsDouble =
Column
-> (Vector Double -> Column) -> Maybe (Vector Double) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Double) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Double)
asMaybeDouble) Vector Double -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Double) -> Maybe (Vector Double)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Double)
asMaybeDouble)
| Bool
otherwise = Column -> (Vector Text -> Column) -> Maybe (Vector Text) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText) Vector Text -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Text) -> Maybe (Vector Text)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Text)
asMaybeText)
where
asMaybeDouble :: Vector (Maybe Double)
asMaybeDouble = (Maybe Text -> Maybe Double)
-> Vector (Maybe Text) -> Vector (Maybe Double)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Double
Text -> Maybe Double
readDouble) Vector (Maybe Text)
asMaybeText
parsableAsDouble :: Bool
parsableAsDouble = Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble
handleDateAssumption :: DateFormat -> V.Vector (Maybe T.Text) -> Column
handleDateAssumption :: DateFormat -> Vector (Maybe Text) -> Column
handleDateAssumption DateFormat
dateFormat Vector (Maybe Text)
asMaybeText
| Bool
parsableAsDate =
Column -> (Vector Day -> Column) -> Maybe (Vector Day) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Day) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Day)
asMaybeDate) Vector Day -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Day) -> Maybe (Vector Day)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Day)
asMaybeDate)
| Bool
otherwise = Column -> (Vector Text -> Column) -> Maybe (Vector Text) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText) Vector Text -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Text) -> Maybe (Vector Text)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Text)
asMaybeText)
where
asMaybeDate :: Vector (Maybe Day)
asMaybeDate = (Maybe Text -> Maybe Day)
-> Vector (Maybe Text) -> Vector (Maybe Day)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Day) -> Maybe Day
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= DateFormat -> Text -> Maybe Day
parseTimeOpt DateFormat
dateFormat) Vector (Maybe Text)
asMaybeText
parsableAsDate :: Bool
parsableAsDate = Vector (Maybe Text) -> Vector (Maybe Day) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Day)
asMaybeDate
handleTextAssumption :: V.Vector (Maybe T.Text) -> Column
handleTextAssumption :: Vector (Maybe Text) -> Column
handleTextAssumption Vector (Maybe Text)
asMaybeText = Column -> (Vector Text -> Column) -> Maybe (Vector Text) -> Column
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText) Vector Text -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector (Vector (Maybe Text) -> Maybe (Vector Text)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a.
Applicative f =>
Vector (f a) -> f (Vector a)
sequenceA Vector (Maybe Text)
asMaybeText)
handleNoAssumption :: DateFormat -> V.Vector (Maybe T.Text) -> Column
handleNoAssumption :: DateFormat -> Vector (Maybe Text) -> Column
handleNoAssumption DateFormat
dateFormat Vector (Maybe Text)
asMaybeText
| (Maybe Text -> Bool) -> Vector (Maybe Text) -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
V.all (Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Text
forall a. Maybe a
Nothing) Vector (Maybe Text)
asMaybeText = Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText
| Bool
parsableAsBool = Vector (Maybe Bool) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Bool)
asMaybeBool
| Bool
parsableAsInt = Vector (Maybe Int) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Int)
asMaybeInt
| Bool
parsableAsDouble = Vector (Maybe Double) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Double)
asMaybeDouble
| Bool
parsableAsDate = Vector (Maybe Day) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Day)
asMaybeDate
| Bool
otherwise = Vector (Maybe Text) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector Vector (Maybe Text)
asMaybeText
where
asMaybeBool :: Vector (Maybe Bool)
asMaybeBool = (Maybe Text -> Maybe Bool)
-> Vector (Maybe Text) -> Vector (Maybe Bool)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Bool) -> Maybe Bool
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Bool
Text -> Maybe Bool
readBool) Vector (Maybe Text)
asMaybeText
asMaybeInt :: Vector (Maybe Int)
asMaybeInt = (Maybe Text -> Maybe Int)
-> Vector (Maybe Text) -> Vector (Maybe Int)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Int
Text -> Maybe Int
readInt) Vector (Maybe Text)
asMaybeText
asMaybeDouble :: Vector (Maybe Double)
asMaybeDouble = (Maybe Text -> Maybe Double)
-> Vector (Maybe Text) -> Vector (Maybe Double)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Double
Text -> Maybe Double
readDouble) Vector (Maybe Text)
asMaybeText
asMaybeDate :: Vector (Maybe Day)
asMaybeDate = (Maybe Text -> Maybe Day)
-> Vector (Maybe Text) -> Vector (Maybe Day)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Day) -> Maybe Day
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= DateFormat -> Text -> Maybe Day
parseTimeOpt DateFormat
dateFormat) Vector (Maybe Text)
asMaybeText
parsableAsBool :: Bool
parsableAsBool = Vector (Maybe Text) -> Vector (Maybe Bool) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Bool)
asMaybeBool
parsableAsInt :: Bool
parsableAsInt =
Vector (Maybe Text) -> Vector (Maybe Int) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Int)
asMaybeInt
Bool -> Bool -> Bool
&& Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble
parsableAsDouble :: Bool
parsableAsDouble = Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble
parsableAsDate :: Bool
parsableAsDate = Vector (Maybe Text) -> Vector (Maybe Day) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Day)
asMaybeDate
convertNullish :: [T.Text] -> T.Text -> Maybe T.Text
convertNullish :: [Text] -> Text -> Maybe Text
convertNullish [Text]
missing Text
v = if Text -> Bool
isNullish Text
v Bool -> Bool -> Bool
|| Text
v Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
missing then Maybe Text
forall a. Maybe a
Nothing else Text -> Maybe Text
forall a. a -> Maybe a
Just Text
v
convertOnlyEmpty :: T.Text -> Maybe T.Text
convertOnlyEmpty :: Text -> Maybe Text
convertOnlyEmpty Text
v = if Text
v Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"" then Maybe Text
forall a. Maybe a
Nothing else Text -> Maybe Text
forall a. a -> Maybe a
Just Text
v
parseTimeOpt :: DateFormat -> T.Text -> Maybe Day
parseTimeOpt :: DateFormat -> Text -> Maybe Day
parseTimeOpt DateFormat
dateFormat Text
s =
Bool -> TimeLocale -> DateFormat -> DateFormat -> Maybe Day
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> DateFormat -> DateFormat -> m t
parseTimeM
Bool
True
TimeLocale
defaultTimeLocale
DateFormat
dateFormat
(Text -> DateFormat
T.unpack Text
s)
unsafeParseTime :: DateFormat -> T.Text -> Day
unsafeParseTime :: DateFormat -> Text -> Day
unsafeParseTime DateFormat
dateFormat Text
s =
Bool -> TimeLocale -> DateFormat -> DateFormat -> Day
forall t.
ParseTime t =>
Bool -> TimeLocale -> DateFormat -> DateFormat -> t
parseTimeOrError
Bool
True
TimeLocale
defaultTimeLocale
DateFormat
dateFormat
(Text -> DateFormat
T.unpack Text
s)
hasNullValues :: (Eq a) => V.Vector (Maybe a) -> Bool
hasNullValues :: forall a. Eq a => Vector (Maybe a) -> Bool
hasNullValues = (Maybe a -> Bool) -> Vector (Maybe a) -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
V.any (Maybe a -> Maybe a -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe a
forall a. Maybe a
Nothing)
vecSameConstructor :: V.Vector (Maybe a) -> V.Vector (Maybe b) -> Bool
vecSameConstructor :: forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe a)
xs Vector (Maybe b)
ys = (Vector (Maybe a) -> Int
forall a. Vector a -> Int
V.length Vector (Maybe a)
xs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Vector (Maybe b) -> Int
forall a. Vector a -> Int
V.length Vector (Maybe b)
ys) Bool -> Bool -> Bool
&& Vector Bool -> Bool
V.and ((Maybe a -> Maybe b -> Bool)
-> Vector (Maybe a) -> Vector (Maybe b) -> Vector Bool
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
V.zipWith Maybe a -> Maybe b -> Bool
forall a b. Maybe a -> Maybe b -> Bool
hasSameConstructor Vector (Maybe a)
xs Vector (Maybe b)
ys)
where
hasSameConstructor :: Maybe a -> Maybe b -> Bool
hasSameConstructor :: forall a b. Maybe a -> Maybe b -> Bool
hasSameConstructor (Just a
_) (Just b
_) = Bool
True
hasSameConstructor Maybe a
Nothing Maybe b
Nothing = Bool
True
hasSameConstructor Maybe a
_ Maybe b
_ = Bool
False
makeParsingAssumption ::
DateFormat -> V.Vector (Maybe T.Text) -> ParsingAssumption
makeParsingAssumption :: DateFormat -> Vector (Maybe Text) -> ParsingAssumption
makeParsingAssumption DateFormat
dateFormat Vector (Maybe Text)
asMaybeText
| (Maybe Text -> Bool) -> Vector (Maybe Text) -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
V.all (Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Text
forall a. Maybe a
Nothing) Vector (Maybe Text)
asMaybeText = ParsingAssumption
NoAssumption
| Vector (Maybe Text) -> Vector (Maybe Bool) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Bool)
asMaybeBool = ParsingAssumption
BoolAssumption
| Vector (Maybe Text) -> Vector (Maybe Int) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Int)
asMaybeInt
Bool -> Bool -> Bool
&& Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble =
ParsingAssumption
IntAssumption
| Vector (Maybe Text) -> Vector (Maybe Double) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Double)
asMaybeDouble = ParsingAssumption
DoubleAssumption
| Vector (Maybe Text) -> Vector (Maybe Day) -> Bool
forall a b. Vector (Maybe a) -> Vector (Maybe b) -> Bool
vecSameConstructor Vector (Maybe Text)
asMaybeText Vector (Maybe Day)
asMaybeDate = ParsingAssumption
DateAssumption
| Bool
otherwise = ParsingAssumption
TextAssumption
where
asMaybeBool :: Vector (Maybe Bool)
asMaybeBool = (Maybe Text -> Maybe Bool)
-> Vector (Maybe Text) -> Vector (Maybe Bool)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Bool) -> Maybe Bool
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Bool
Text -> Maybe Bool
readBool) Vector (Maybe Text)
asMaybeText
asMaybeInt :: Vector (Maybe Int)
asMaybeInt = (Maybe Text -> Maybe Int)
-> Vector (Maybe Text) -> Vector (Maybe Int)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Int
Text -> Maybe Int
readInt) Vector (Maybe Text)
asMaybeText
asMaybeDouble :: Vector (Maybe Double)
asMaybeDouble = (Maybe Text -> Maybe Double)
-> Vector (Maybe Text) -> Vector (Maybe Double)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= HasCallStack => Text -> Maybe Double
Text -> Maybe Double
readDouble) Vector (Maybe Text)
asMaybeText
asMaybeDate :: Vector (Maybe Day)
asMaybeDate = (Maybe Text -> Maybe Day)
-> Vector (Maybe Text) -> Vector (Maybe Day)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe Text -> (Text -> Maybe Day) -> Maybe Day
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= DateFormat -> Text -> Maybe Day
parseTimeOpt DateFormat
dateFormat) Vector (Maybe Text)
asMaybeText
data ParsingAssumption
= BoolAssumption
| IntAssumption
| DoubleAssumption
| DateAssumption
| NoAssumption
| TextAssumption
parseWithTypes :: Bool -> M.Map T.Text SchemaType -> DataFrame -> DataFrame
parseWithTypes :: Bool -> Map Text SchemaType -> DataFrame -> DataFrame
parseWithTypes Bool
safe Map Text SchemaType
ts DataFrame
df
| Map Text SchemaType -> Bool
forall k a. Map k a -> Bool
M.null Map Text SchemaType
ts = DataFrame
df
| Bool
otherwise =
(Text -> SchemaType -> DataFrame -> DataFrame)
-> DataFrame -> Map Text SchemaType -> DataFrame
forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
M.foldrWithKey
(\Text
k SchemaType
v DataFrame
d -> Text -> Column -> DataFrame -> DataFrame
insertColumn Text
k (SchemaType -> Column -> Column
asType SchemaType
v (Text -> DataFrame -> Column
unsafeGetColumn Text
k DataFrame
d)) DataFrame
d)
DataFrame
df
Map Text SchemaType
ts
where
asType :: SchemaType -> Column -> Column
asType :: SchemaType -> Column -> Column
asType (SType (Proxy a
_ :: P.Proxy a)) c :: Column
c@(BoxedColumn (Vector a
col :: V.Vector b)) = case forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a of
App TypeRep a
t1 TypeRep b
t2 -> case TypeRep a -> TypeRep Maybe -> Maybe (a :~~: Maybe)
forall k1 k2 (a :: k1) (b :: k2).
TypeRep a -> TypeRep b -> Maybe (a :~~: b)
eqTypeRep TypeRep a
t1 (forall {k} (a :: k). Typeable a => TypeRep a
forall (a :: * -> *). Typeable a => TypeRep a
typeRep @Maybe) of
Just a :~~: Maybe
HRefl -> case TypeRep a -> TypeRep a -> Maybe (a :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just a :~: a
Refl -> Column
c
Maybe (a :~: a)
Nothing -> case TypeRep Text -> TypeRep a -> Maybe (Text :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @T.Text) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just Text :~: a
Refl -> Vector (Maybe b) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((Text -> Maybe b) -> Vector Text -> Vector (Maybe b)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe (Maybe b) -> Maybe b
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe b) -> Maybe b)
-> (Text -> Maybe (Maybe b)) -> Text -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Read a => DateFormat -> Maybe a
readAsMaybe @a) (DateFormat -> Maybe (Maybe b))
-> (Text -> DateFormat) -> Text -> Maybe (Maybe b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> DateFormat
T.unpack) Vector a
Vector Text
col)
Maybe (Text :~: a)
Nothing -> Vector (Maybe b) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((a -> Maybe b) -> Vector a -> Vector (Maybe b)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (Maybe (Maybe b) -> Maybe b
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe b) -> Maybe b)
-> (a -> Maybe (Maybe b)) -> a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Read a => DateFormat -> Maybe a
readAsMaybe @a) (DateFormat -> Maybe (Maybe b))
-> (a -> DateFormat) -> a -> Maybe (Maybe b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> DateFormat
forall a. Show a => a -> DateFormat
show) Vector a
col)
Maybe (a :~~: Maybe)
Nothing -> case TypeRep a
t1 of
App TypeRep a
t1' TypeRep b
t2' -> case TypeRep a -> TypeRep Either -> Maybe (a :~~: Either)
forall k1 k2 (a :: k1) (b :: k2).
TypeRep a -> TypeRep b -> Maybe (a :~~: b)
eqTypeRep TypeRep a
t1' (forall {k} (a :: k). Typeable a => TypeRep a
forall (a :: * -> * -> *). Typeable a => TypeRep a
typeRep @Either) of
Just a :~~: Either
HRefl -> case TypeRep a -> TypeRep a -> Maybe (a :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just a :~: a
Refl -> Column
c
Maybe (a :~: a)
Nothing -> case TypeRep Text -> TypeRep a -> Maybe (Text :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @T.Text) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just Text :~: a
Refl -> Vector a -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((Text -> a) -> Vector Text -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> a
readAsEither @a) (DateFormat -> a) -> (Text -> DateFormat) -> Text -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> DateFormat
T.unpack) Vector a
Vector Text
col)
Maybe (Text :~: a)
Nothing -> Vector a -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((a -> a) -> Vector a -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> a
readAsEither @a) (DateFormat -> a) -> (a -> DateFormat) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> DateFormat
forall a. Show a => a -> DateFormat
show) Vector a
col)
Maybe (a :~~: Either)
Nothing -> case TypeRep a -> TypeRep a -> Maybe (a :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just a :~: a
Refl -> Column
c
Maybe (a :~: a)
Nothing -> case TypeRep Text -> TypeRep a -> Maybe (Text :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @T.Text) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just Text :~: a
Refl ->
if Bool
safe
then Vector (Maybe a) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((Text -> Maybe a) -> Vector Text -> Vector (Maybe a)
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> Maybe a
readMaybe @a) (DateFormat -> Maybe a) -> (Text -> DateFormat) -> Text -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> DateFormat
T.unpack) Vector a
Vector Text
col)
else Vector a -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((Text -> a) -> Vector Text -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> a
read @a) (DateFormat -> a) -> (Text -> DateFormat) -> Text -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> DateFormat
T.unpack) Vector a
Vector Text
col)
Maybe (Text :~: a)
Nothing ->
if Bool
safe
then Vector (Maybe a) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((a -> Maybe a) -> Vector a -> Vector (Maybe a)
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> Maybe a
readMaybe @a) (DateFormat -> Maybe a) -> (a -> DateFormat) -> a -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> DateFormat
forall a. Show a => a -> DateFormat
show) Vector a
col)
else Vector a -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((a -> a) -> Vector a -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> a
read @a) (DateFormat -> a) -> (a -> DateFormat) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> DateFormat
forall a. Show a => a -> DateFormat
show) Vector a
col)
TypeRep a
_ -> Column
c
TypeRep a
_ -> case TypeRep a -> TypeRep a -> Maybe (a :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @a) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just a :~: a
Refl -> Column
c
Maybe (a :~: a)
Nothing -> case TypeRep Text -> TypeRep a -> Maybe (Text :~: a)
forall a b. TypeRep a -> TypeRep b -> Maybe (a :~: b)
forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @T.Text) (forall a. Typeable a => TypeRep a
forall {k} (a :: k). Typeable a => TypeRep a
typeRep @b) of
Just Text :~: a
Refl ->
if Bool
safe
then Vector (Maybe a) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((Text -> Maybe a) -> Vector Text -> Vector (Maybe a)
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> Maybe a
readMaybe @a) (DateFormat -> Maybe a) -> (Text -> DateFormat) -> Text -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> DateFormat
T.unpack) Vector a
Vector Text
col)
else Vector a -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((Text -> a) -> Vector Text -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> a
read @a) (DateFormat -> a) -> (Text -> DateFormat) -> Text -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> DateFormat
T.unpack) Vector a
Vector Text
col)
Maybe (Text :~: a)
Nothing ->
if Bool
safe
then Vector (Maybe a) -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((a -> Maybe a) -> Vector a -> Vector (Maybe a)
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> Maybe a
readMaybe @a) (DateFormat -> Maybe a) -> (a -> DateFormat) -> a -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> DateFormat
forall a. Show a => a -> DateFormat
show) Vector a
col)
else Vector a -> Column
forall a.
(Columnable a, ColumnifyRep (KindOf a) a) =>
Vector a -> Column
fromVector ((a -> a) -> Vector a -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((forall a. Read a => DateFormat -> a
read @a) (DateFormat -> a) -> (a -> DateFormat) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> DateFormat
forall a. Show a => a -> DateFormat
show) Vector a
col)
asType SchemaType
_ Column
c = Column
c
readAsMaybe :: (Read a) => String -> Maybe a
readAsMaybe :: forall a. Read a => DateFormat -> Maybe a
readAsMaybe DateFormat
s
| DateFormat -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null DateFormat
s = Maybe a
forall a. Maybe a
Nothing
| Bool
otherwise = DateFormat -> Maybe a
forall a. Read a => DateFormat -> Maybe a
readMaybe (DateFormat -> Maybe a) -> DateFormat -> Maybe a
forall a b. (a -> b) -> a -> b
$ DateFormat
"Just " DateFormat -> DateFormat -> DateFormat
forall a. Semigroup a => a -> a -> a
<> DateFormat
s
readAsEither :: (Read a) => String -> a
readAsEither :: forall a. Read a => DateFormat -> a
readAsEither DateFormat
v = case [Maybe a] -> Maybe a
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [DateFormat -> Maybe a
forall a. Read a => DateFormat -> Maybe a
readMaybe (DateFormat -> Maybe a) -> DateFormat -> Maybe a
forall a b. (a -> b) -> a -> b
$ DateFormat
"Left " DateFormat -> DateFormat -> DateFormat
forall a. Semigroup a => a -> a -> a
<> DateFormat
s, DateFormat -> Maybe a
forall a. Read a => DateFormat -> Maybe a
readMaybe (DateFormat -> Maybe a) -> DateFormat -> Maybe a
forall a b. (a -> b) -> a -> b
$ DateFormat
"Right " DateFormat -> DateFormat -> DateFormat
forall a. Semigroup a => a -> a -> a
<> DateFormat
s] of
Maybe a
Nothing -> DateFormat -> a
forall a. HasCallStack => DateFormat -> a
error (DateFormat -> a) -> DateFormat -> a
forall a b. (a -> b) -> a -> b
$ DateFormat
"Couldn't read value: " DateFormat -> DateFormat -> DateFormat
forall a. Semigroup a => a -> a -> a
<> DateFormat
s
Just a
v -> a
v
where
s :: DateFormat
s = if DateFormat -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null DateFormat
v then DateFormat
"\"\"" else DateFormat
v