{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE ScopedTypeVariables #-} module Spark.Core.Internal.ColumnStructures where import Control.Arrow ((&&&)) import Data.Function(on) import Spark.Core.Internal.DatasetStructures import Spark.Core.Internal.RowStructures import Spark.Core.Internal.TypesStructures import Spark.Core.Internal.OpStructures import Spark.Core.StructuresInternal import Spark.Core.Try {-| The data structure that implements the notion of data columns. The type on this one may either be a Cell or a proper type. A column of data from a dataset The ref is a reference potentially to the originating dataset, but it may be more general than that to perform type-safe tricks. TODO: try something like this https://www.vidarholen.net/contents/junk/catbag.html -} data ColumnData ref a = ColumnData { -- TODO replace by a maybe to have an easier way to deal with constant -- columns. _cOrigin :: !UntypedDataset, _cType :: !DataType, _cOp :: !ColOp, -- The name in the dataset. -- If not set, it will be deduced from the operation. _cReferingPath :: !(Maybe FieldName) } {-| A column of data from a dataset or a dataframe. This column is typed: the operations on this column will be validdated by Haskell' type inferenc. -} type Column ref a = ColumnData ref a {-| An untyped column of data from a dataset or a dataframe. This column is untyped and may not be properly constructed. Any error will be found during the analysis phase at runtime. -} type DynColumn = Try (ColumnData UnknownReference Cell) -- | (internal) -- The type of untyped column data. type UntypedColumnData = ColumnData UnknownReference Cell {-| A dummy data type that indicates the data referenc is missing. -} data UnknownReference {-| A tag that carries the reference information of a column at a type level. This is useful when creating column. See ref and colRef. -} data ColumnReference a = ColumnReference instance forall ref a. Eq (ColumnData ref a) where (==) = (==) `on` (_cOrigin &&& _cType &&& _cOp &&& _cReferingPath)