{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-inline-rule-shadowing #-}
module Data.Frame (
Column, Frameable, Row, Frame,
fromRows, toRows, fields,
null, length, mapRows, mapRowsM, filterRows, foldlRows,
sortRowsBy, sortRowsByUnique,
sortRowsByKey, sortRowsByKeyUnique, sortRowsByKeyUniqueOn,
display,
displayWith, DisplayOptions(..), defaultDisplayOptions,
ilookup, iat,
Indexable(Key, index), lookup, at,
zipRowsWith,
mergeWithStrategy, mergeWithStrategyOn, matchedStrategy,
These(..),
) where
import Control.Exception (assert)
import Control.Monad.ST ( runST )
import Data.Bifunctor (second)
import qualified Data.Foldable
import Data.Function (on)
import Data.Functor ((<&>))
import Data.Functor.Identity (Identity(..))
import Data.Kind (Type)
import qualified Data.List as List ( intersperse, foldl' )
import Data.Maybe (catMaybes)
import Data.Sequence (Seq(..))
import qualified Data.Sequence as Seq
import Data.Semigroup (Max(..))
import qualified Data.Set as Set
import Data.These (These(..))
import Data.Tuple (swap)
import Data.Vector (Vector)
import qualified Data.Vector
import qualified Data.Vector.Algorithms.Tim as TimSort (sortBy, sortUniqBy)
import Prelude hiding (lookup, null, length)
import qualified Prelude
import GHC.Generics ( Selector, Generic(..), S, D, C, K1(..), Rec0, M1(..), type (:*:)(..), selName )
fromRows :: (Frameable t, Foldable f)
=> f (Row t)
-> Frame t
fromRows :: forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows = Vector (Row t) -> Frame t
forall (t :: (* -> *) -> *).
Frameable t =>
Vector (Row t) -> Frame t
pack (Vector (Row t) -> Frame t)
-> (f (Row t) -> Vector (Row t)) -> f (Row t) -> Frame t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Row t] -> Vector (Row t)
forall a. [a] -> Vector a
Data.Vector.fromList ([Row t] -> Vector (Row t))
-> (f (Row t) -> [Row t]) -> f (Row t) -> Vector (Row t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f (Row t) -> [Row t]
forall a. f a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
Data.Foldable.toList
{-# INLINE[~2] fromRows #-}
toRows :: Frameable t
=> Frame t
-> Vector (Row t)
toRows :: forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows = Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
unpack
{-# INLINE[~2] toRows #-}
{-# RULES
"fromRows/toRows" [2] fromRows . toRows = id
"toRows/fromRows" [2] toRows . fromRows = id
#-}
null :: Frameable t
=> Frame t
-> Bool
null :: forall (t :: (* -> *) -> *). Frameable t => Frame t -> Bool
null = Vector (Row t) -> Bool
forall a. Vector a -> Bool
Data.Vector.null (Vector (Row t) -> Bool)
-> (Frame t -> Vector (Row t)) -> Frame t -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows
length :: Frameable t
=> Frame t
-> Int
length :: forall (t :: (* -> *) -> *). Frameable t => Frame t -> Int
length = Vector (Row t) -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector (Row t) -> Int)
-> (Frame t -> Vector (Row t)) -> Frame t -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows
mapRows :: (Frameable t1, Frameable t2)
=> (Row t1 -> Row t2)
-> Frame t1
-> Frame t2
mapRows :: forall (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *).
(Frameable t1, Frameable t2) =>
(Row t1 -> Row t2) -> Frame t1 -> Frame t2
mapRows Row t1 -> Row t2
f = Vector (Row t2) -> Frame t2
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows
(Vector (Row t2) -> Frame t2)
-> (Frame t1 -> Vector (Row t2)) -> Frame t1 -> Frame t2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Row t1 -> Row t2) -> Vector (Row t1) -> Vector (Row t2)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Row t1 -> Row t2
f
(Vector (Row t1) -> Vector (Row t2))
-> (Frame t1 -> Vector (Row t1)) -> Frame t1 -> Vector (Row t2)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t1 -> Vector (Row t1)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows
mapRowsM :: (Frameable t1, Frameable t2, Monad m)
=> (Row t1 -> m (Row t2))
-> Frame t1
-> m (Frame t2)
mapRowsM :: forall (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *) (m :: * -> *).
(Frameable t1, Frameable t2, Monad m) =>
(Row t1 -> m (Row t2)) -> Frame t1 -> m (Frame t2)
mapRowsM Row t1 -> m (Row t2)
f = (Vector (Row t2) -> Frame t2)
-> m (Vector (Row t2)) -> m (Frame t2)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Vector (Row t2) -> Frame t2
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows
(m (Vector (Row t2)) -> m (Frame t2))
-> (Frame t1 -> m (Vector (Row t2))) -> Frame t1 -> m (Frame t2)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Row t1 -> m (Row t2)) -> Vector (Row t1) -> m (Vector (Row t2))
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Vector a -> m (Vector b)
Data.Vector.mapM Row t1 -> m (Row t2)
f
(Vector (Row t1) -> m (Vector (Row t2)))
-> (Frame t1 -> Vector (Row t1)) -> Frame t1 -> m (Vector (Row t2))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t1 -> Vector (Row t1)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows
filterRows :: (Frameable t)
=> (Row t -> Bool)
-> Frame t
-> Frame t
filterRows :: forall (t :: (* -> *) -> *).
Frameable t =>
(Row t -> Bool) -> Frame t -> Frame t
filterRows Row t -> Bool
f = Vector (Row t) -> Frame t
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows
(Vector (Row t) -> Frame t)
-> (Frame t -> Vector (Row t)) -> Frame t -> Frame t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Row t -> Bool) -> Vector (Row t) -> Vector (Row t)
forall a. (a -> Bool) -> Vector a -> Vector a
Data.Vector.filter Row t -> Bool
f
(Vector (Row t) -> Vector (Row t))
-> (Frame t -> Vector (Row t)) -> Frame t -> Vector (Row t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows
zipRowsWith :: (Frameable t1, Frameable t2, Frameable t3)
=> (Row t1 -> Row t2 -> Row t3)
-> Frame t1
-> Frame t2
-> Frame t3
zipRowsWith :: forall (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *)
(t3 :: (* -> *) -> *).
(Frameable t1, Frameable t2, Frameable t3) =>
(Row t1 -> Row t2 -> Row t3) -> Frame t1 -> Frame t2 -> Frame t3
zipRowsWith Row t1 -> Row t2 -> Row t3
f Frame t1
xs Frame t2
ys
= Vector (Row t3) -> Frame t3
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows
(Vector (Row t3) -> Frame t3) -> Vector (Row t3) -> Frame t3
forall a b. (a -> b) -> a -> b
$ (Row t1 -> Row t2 -> Row t3)
-> Vector (Row t1) -> Vector (Row t2) -> Vector (Row t3)
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
Data.Vector.zipWith Row t1 -> Row t2 -> Row t3
f
(Frame t1 -> Vector (Row t1)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t1
xs)
(Frame t2 -> Vector (Row t2)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t2
ys)
foldlRows :: Frameable t
=> (b -> Row t -> b)
-> b
-> Frame t
-> b
foldlRows :: forall (t :: (* -> *) -> *) b.
Frameable t =>
(b -> Row t -> b) -> b -> Frame t -> b
foldlRows b -> Row t -> b
f b
start
= (b -> Row t -> b) -> b -> Vector (Row t) -> b
forall a b. (a -> b -> a) -> a -> Vector b -> a
Data.Vector.foldl' b -> Row t -> b
f b
start (Vector (Row t) -> b)
-> (Frame t -> Vector (Row t)) -> Frame t -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows
ilookup :: Frameable t
=> Int
-> Frame t
-> Maybe (Row t)
ilookup :: forall (t :: (* -> *) -> *).
Frameable t =>
Int -> Frame t -> Maybe (Row t)
ilookup = Int -> Frame t -> Maybe (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Int -> Frame t -> Maybe (Row t)
iindex
sortRowsBy :: Frameable t
=> (Row t -> Row t -> Ordering)
-> Frame t
-> Frame t
sortRowsBy :: forall (t :: (* -> *) -> *).
Frameable t =>
(Row t -> Row t -> Ordering) -> Frame t -> Frame t
sortRowsBy Row t -> Row t -> Ordering
cmp Frame t
df
= let rs :: Vector (Row t)
rs = Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t
df
in Vector (Row t) -> Frame t
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows (Vector (Row t) -> Frame t) -> Vector (Row t) -> Frame t
forall a b. (a -> b) -> a -> b
$ (forall s. ST s (Vector (Row t))) -> Vector (Row t)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Vector (Row t))) -> Vector (Row t))
-> (forall s. ST s (Vector (Row t))) -> Vector (Row t)
forall a b. (a -> b) -> a -> b
$ do
MVector s (Row t)
mutVec <- Vector (Row t) -> ST s (MVector (PrimState (ST s)) (Row t))
forall (m :: * -> *) a.
PrimMonad m =>
Vector a -> m (MVector (PrimState m) a)
Data.Vector.thaw Vector (Row t)
rs
(Row t -> Row t -> Ordering)
-> MVector (PrimState (ST s)) (Row t) -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m ()
TimSort.sortBy Row t -> Row t -> Ordering
cmp MVector s (Row t)
MVector (PrimState (ST s)) (Row t)
mutVec
MVector (PrimState (ST s)) (Row t) -> ST s (Vector (Row t))
forall (m :: * -> *) a.
PrimMonad m =>
MVector (PrimState m) a -> m (Vector a)
Data.Vector.freeze MVector s (Row t)
MVector (PrimState (ST s)) (Row t)
mutVec ST s (Vector (Row t))
-> (Vector (Row t) -> Vector (Row t)) -> ST s (Vector (Row t))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Vector (Row t) -> Vector (Row t)
forall a. Vector a -> Vector a
Data.Vector.force
{-# INLINABLE sortRowsBy #-}
sortRowsByUnique :: Frameable t
=> (Row t -> Row t -> Ordering)
-> Frame t
-> Frame t
sortRowsByUnique :: forall (t :: (* -> *) -> *).
Frameable t =>
(Row t -> Row t -> Ordering) -> Frame t -> Frame t
sortRowsByUnique Row t -> Row t -> Ordering
cmp Frame t
df
= let rs :: Vector (Row t)
rs = Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t
df
in Vector (Row t) -> Frame t
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows (Vector (Row t) -> Frame t) -> Vector (Row t) -> Frame t
forall a b. (a -> b) -> a -> b
$ (forall s. ST s (Vector (Row t))) -> Vector (Row t)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Vector (Row t))) -> Vector (Row t))
-> (forall s. ST s (Vector (Row t))) -> Vector (Row t)
forall a b. (a -> b) -> a -> b
$ do
MVector s (Row t)
mutVec <- Vector (Row t) -> ST s (MVector (PrimState (ST s)) (Row t))
forall (m :: * -> *) a.
PrimMonad m =>
Vector a -> m (MVector (PrimState m) a)
Data.Vector.thaw Vector (Row t)
rs
(Row t -> Row t -> Ordering)
-> MVector (PrimState (ST s)) (Row t)
-> ST s (MVector (PrimState (ST s)) (Row t))
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m (v (PrimState m) e)
TimSort.sortUniqBy Row t -> Row t -> Ordering
cmp MVector s (Row t)
MVector (PrimState (ST s)) (Row t)
mutVec ST s (MVector s (Row t))
-> (MVector s (Row t) -> ST s (Vector (Row t)))
-> ST s (Vector (Row t))
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MVector s (Row t) -> ST s (Vector (Row t))
MVector (PrimState (ST s)) (Row t) -> ST s (Vector (Row t))
forall (m :: * -> *) a.
PrimMonad m =>
MVector (PrimState m) a -> m (Vector a)
Data.Vector.freeze ST s (Vector (Row t))
-> (Vector (Row t) -> Vector (Row t)) -> ST s (Vector (Row t))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Vector (Row t) -> Vector (Row t)
forall a. Vector a -> Vector a
Data.Vector.force
{-# INLINABLE sortRowsByUnique #-}
sortRowsByKey :: (Indexable t)
=> Frame t
-> Frame t
sortRowsByKey :: forall (t :: (* -> *) -> *). Indexable t => Frame t -> Frame t
sortRowsByKey Frame t
df =
let ix :: Vector (Key t, Int)
ix = ((Int, Key t) -> (Key t, Int))
-> Vector (Int, Key t) -> Vector (Key t, Int)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map (Int, Key t) -> (Key t, Int)
forall a b. (a, b) -> (b, a)
swap
(Vector (Int, Key t) -> Vector (Key t, Int))
-> Vector (Int, Key t) -> Vector (Key t, Int)
forall a b. (a -> b) -> a -> b
$ Vector (Key t) -> Vector (Int, Key t)
forall a. Vector a -> Vector (Int, a)
Data.Vector.indexed (Frame t -> Vector (Key t)
forall (t :: (* -> *) -> *).
Indexable t =>
Frame t -> Vector (Key t)
index Frame t
df)
sortedIx :: Vector Int
sortedIx = ((Key t, Int) -> Int) -> Vector (Key t, Int) -> Vector Int
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map (Key t, Int) -> Int
forall a b. (a, b) -> b
snd (Vector (Key t, Int) -> Vector Int)
-> Vector (Key t, Int) -> Vector Int
forall a b. (a -> b) -> a -> b
$ (forall s. ST s (Vector (Key t, Int))) -> Vector (Key t, Int)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Vector (Key t, Int))) -> Vector (Key t, Int))
-> (forall s. ST s (Vector (Key t, Int))) -> Vector (Key t, Int)
forall a b. (a -> b) -> a -> b
$ do
MVector s (Key t, Int)
mutVec <- Vector (Key t, Int)
-> ST s (MVector (PrimState (ST s)) (Key t, Int))
forall (m :: * -> *) a.
PrimMonad m =>
Vector a -> m (MVector (PrimState m) a)
Data.Vector.thaw Vector (Key t, Int)
ix
Comparison (Key t, Int)
-> MVector (PrimState (ST s)) (Key t, Int) -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m ()
TimSort.sortBy (Key t -> Key t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Key t -> Key t -> Ordering)
-> ((Key t, Int) -> Key t) -> Comparison (Key t, Int)
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (Key t, Int) -> Key t
forall a b. (a, b) -> a
fst) MVector s (Key t, Int)
MVector (PrimState (ST s)) (Key t, Int)
mutVec
MVector (PrimState (ST s)) (Key t, Int)
-> ST s (Vector (Key t, Int))
forall (m :: * -> *) a.
PrimMonad m =>
MVector (PrimState m) a -> m (Vector a)
Data.Vector.freeze MVector s (Key t, Int)
MVector (PrimState (ST s)) (Key t, Int)
mutVec ST s (Vector (Key t, Int))
-> (Vector (Key t, Int) -> Vector (Key t, Int))
-> ST s (Vector (Key t, Int))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Vector (Key t, Int) -> Vector (Key t, Int)
forall a. Vector a -> Vector a
Data.Vector.force
in Vector (Row t) -> Frame t
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows (Vector (Row t) -> Frame t) -> Vector (Row t) -> Frame t
forall a b. (a -> b) -> a -> b
$ Vector (Row t) -> Vector Int -> Vector (Row t)
forall a. Vector a -> Vector Int -> Vector a
Data.Vector.backpermute (Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t
df) Vector Int
sortedIx
{-# INLINABLE sortRowsByKey #-}
sortRowsByKeyUnique :: (Indexable t)
=> Frame t
-> Frame t
sortRowsByKeyUnique :: forall (t :: (* -> *) -> *). Indexable t => Frame t -> Frame t
sortRowsByKeyUnique = (Key t -> Key t) -> Frame t -> Frame t
forall k (t :: (* -> *) -> *).
(Ord k, Indexable t) =>
(Key t -> k) -> Frame t -> Frame t
sortRowsByKeyUniqueOn Key t -> Key t
forall a. a -> a
id
sortRowsByKeyUniqueOn :: (Ord k, Indexable t)
=> (Key t -> k)
-> Frame t
-> Frame t
sortRowsByKeyUniqueOn :: forall k (t :: (* -> *) -> *).
(Ord k, Indexable t) =>
(Key t -> k) -> Frame t -> Frame t
sortRowsByKeyUniqueOn Key t -> k
mapkey Frame t
df =
let ix :: Vector (k, Int)
ix = ((Int, k) -> (k, Int)) -> Vector (Int, k) -> Vector (k, Int)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map (Int, k) -> (k, Int)
forall a b. (a, b) -> (b, a)
swap
(Vector (Int, k) -> Vector (k, Int))
-> Vector (Int, k) -> Vector (k, Int)
forall a b. (a -> b) -> a -> b
$ Vector k -> Vector (Int, k)
forall a. Vector a -> Vector (Int, a)
Data.Vector.indexed ((Key t -> k) -> Vector (Key t) -> Vector k
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Key t -> k
mapkey (Vector (Key t) -> Vector k) -> Vector (Key t) -> Vector k
forall a b. (a -> b) -> a -> b
$ Frame t -> Vector (Key t)
forall (t :: (* -> *) -> *).
Indexable t =>
Frame t -> Vector (Key t)
index Frame t
df)
sortedIx :: Vector Int
sortedIx = ((k, Int) -> Int) -> Vector (k, Int) -> Vector Int
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map (k, Int) -> Int
forall a b. (a, b) -> b
snd (Vector (k, Int) -> Vector Int) -> Vector (k, Int) -> Vector Int
forall a b. (a -> b) -> a -> b
$ (forall s. ST s (Vector (k, Int))) -> Vector (k, Int)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (Vector (k, Int))) -> Vector (k, Int))
-> (forall s. ST s (Vector (k, Int))) -> Vector (k, Int)
forall a b. (a -> b) -> a -> b
$ do
MVector s (k, Int)
mutVec <- Vector (k, Int) -> ST s (MVector (PrimState (ST s)) (k, Int))
forall (m :: * -> *) a.
PrimMonad m =>
Vector a -> m (MVector (PrimState m) a)
Data.Vector.thaw Vector (k, Int)
ix
Comparison (k, Int)
-> MVector (PrimState (ST s)) (k, Int)
-> ST s (MVector (PrimState (ST s)) (k, Int))
forall (m :: * -> *) (v :: * -> * -> *) e.
(PrimMonad m, MVector v e) =>
Comparison e -> v (PrimState m) e -> m (v (PrimState m) e)
TimSort.sortUniqBy (k -> k -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (k -> k -> Ordering) -> ((k, Int) -> k) -> Comparison (k, Int)
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (k, Int) -> k
forall a b. (a, b) -> a
fst) MVector s (k, Int)
MVector (PrimState (ST s)) (k, Int)
mutVec ST s (MVector s (k, Int))
-> (MVector s (k, Int) -> ST s (Vector (k, Int)))
-> ST s (Vector (k, Int))
forall a b. ST s a -> (a -> ST s b) -> ST s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= MVector s (k, Int) -> ST s (Vector (k, Int))
MVector (PrimState (ST s)) (k, Int) -> ST s (Vector (k, Int))
forall (m :: * -> *) a.
PrimMonad m =>
MVector (PrimState m) a -> m (Vector a)
Data.Vector.freeze ST s (Vector (k, Int))
-> (Vector (k, Int) -> Vector (k, Int)) -> ST s (Vector (k, Int))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Vector (k, Int) -> Vector (k, Int)
forall a. Vector a -> Vector a
Data.Vector.force
in Vector (Row t) -> Frame t
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows (Vector (Row t) -> Frame t) -> Vector (Row t) -> Frame t
forall a b. (a -> b) -> a -> b
$ Vector (Row t) -> Vector Int -> Vector (Row t)
forall a. Vector a -> Vector Int -> Vector a
Data.Vector.backpermute (Frame t -> Vector (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t
df) Vector Int
sortedIx
{-# INLINABLE sortRowsByKeyUniqueOn #-}
lookup :: (Indexable t)
=> Key t
-> Frame t
-> Maybe (Row t)
lookup :: forall (t :: (* -> *) -> *).
Indexable t =>
Key t -> Frame t -> Maybe (Row t)
lookup Key t
key Frame t
fr
= (Key t -> Bool) -> Vector (Key t) -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
Data.Vector.findIndex (Key t -> Key t -> Bool
forall a. Eq a => a -> a -> Bool
==Key t
key) (Frame t -> Vector (Key t)
forall (t :: (* -> *) -> *).
Indexable t =>
Frame t -> Vector (Key t)
index Frame t
fr)
Maybe Int -> (Int -> Maybe (Row t)) -> Maybe (Row t)
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> Frame t -> Maybe (Row t))
-> Frame t -> Int -> Maybe (Row t)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Int -> Frame t -> Maybe (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Int -> Frame t -> Maybe (Row t)
ilookup Frame t
fr
at :: (Indexable t)
=> Frame t
-> (Key t, Frame t -> Vector a)
-> Maybe a
Frame t
fr at :: forall (t :: (* -> *) -> *) a.
Indexable t =>
Frame t -> (Key t, Frame t -> Vector a) -> Maybe a
`at` (Key t
row, Frame t -> Vector a
col)
= (Key t -> Bool) -> Vector (Key t) -> Maybe Int
forall a. (a -> Bool) -> Vector a -> Maybe Int
Data.Vector.findIndex (Key t -> Key t -> Bool
forall a. Eq a => a -> a -> Bool
==Key t
row) (Frame t -> Vector (Key t)
forall (t :: (* -> *) -> *).
Indexable t =>
Frame t -> Vector (Key t)
index Frame t
fr)
Maybe Int -> (Int -> Maybe a) -> Maybe a
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
ix -> (Frame t -> Vector a
col Frame t
fr) Vector a -> Int -> Maybe a
forall a. Vector a -> Int -> Maybe a
Data.Vector.!? Int
ix
iat :: Frame t
-> (Int, Frame t -> Vector a)
-> Maybe a
Frame t
fr iat :: forall (t :: (* -> *) -> *) a.
Frame t -> (Int, Frame t -> Vector a) -> Maybe a
`iat` (Int
rowIx, Frame t -> Vector a
col) = (Frame t -> Vector a
col Frame t
fr) Vector a -> Int -> Maybe a
forall a. Vector a -> Int -> Maybe a
Data.Vector.!? Int
rowIx
mergeWithStrategy :: ( Indexable t1, Indexable t2, Frameable t3
, Key t1 ~ Key t2
)
=> MergeStrategy (Key t1) t1 t2 t3
-> Frame t1
-> Frame t2
-> Frame t3
mergeWithStrategy :: forall (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *)
(t3 :: (* -> *) -> *).
(Indexable t1, Indexable t2, Frameable t3, Key t1 ~ Key t2) =>
MergeStrategy (Key t1) t1 t2 t3 -> Frame t1 -> Frame t2 -> Frame t3
mergeWithStrategy = (Key t1 -> Key t2)
-> (Key t2 -> Key t2)
-> MergeStrategy (Key t2) t1 t2 t3
-> t1 Vector
-> t2 Vector
-> t3 Vector
forall k (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *)
(t3 :: (* -> *) -> *).
(Ord k, Indexable t1, Indexable t2, Frameable t3) =>
(Key t1 -> k)
-> (Key t2 -> k)
-> MergeStrategy k t1 t2 t3
-> Frame t1
-> Frame t2
-> Frame t3
mergeWithStrategyOn Key t1 -> Key t2
Key t2 -> Key t2
forall a. a -> a
id Key t2 -> Key t2
forall a. a -> a
id
mergeWithStrategyOn :: ( Ord k, Indexable t1, Indexable t2, Frameable t3)
=> (Key t1 -> k)
-> (Key t2 -> k)
-> MergeStrategy k t1 t2 t3
-> Frame t1
-> Frame t2
-> Frame t3
mergeWithStrategyOn :: forall k (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *)
(t3 :: (* -> *) -> *).
(Ord k, Indexable t1, Indexable t2, Frameable t3) =>
(Key t1 -> k)
-> (Key t2 -> k)
-> MergeStrategy k t1 t2 t3
-> Frame t1
-> Frame t2
-> Frame t3
mergeWithStrategyOn Key t1 -> k
mapk1 Key t2 -> k
mapk2 MergeStrategy k t1 t2 t3
strat Frame t1
df1Unsorted Frame t2
df2Unsorted
= let df1 :: Frame t1
df1 = (Key t1 -> k) -> Frame t1 -> Frame t1
forall k (t :: (* -> *) -> *).
(Ord k, Indexable t) =>
(Key t -> k) -> Frame t -> Frame t
sortRowsByKeyUniqueOn Key t1 -> k
mapk1 Frame t1
df1Unsorted
df2 :: Frame t2
df2 = (Key t2 -> k) -> Frame t2 -> Frame t2
forall k (t :: (* -> *) -> *).
(Ord k, Indexable t) =>
(Key t -> k) -> Frame t -> Frame t
sortRowsByKeyUniqueOn Key t2 -> k
mapk2 Frame t2
df2Unsorted
ix1 :: Vector k
ix1 = (Key t1 -> k) -> Vector (Key t1) -> Vector k
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Key t1 -> k
mapk1 (Vector (Key t1) -> Vector k) -> Vector (Key t1) -> Vector k
forall a b. (a -> b) -> a -> b
$ Frame t1 -> Vector (Key t1)
forall (t :: (* -> *) -> *).
Indexable t =>
Frame t -> Vector (Key t)
index Frame t1
df1
ix2 :: Vector k
ix2 = (Key t2 -> k) -> Vector (Key t2) -> Vector k
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Key t2 -> k
mapk2 (Vector (Key t2) -> Vector k) -> Vector (Key t2) -> Vector k
forall a b. (a -> b) -> a -> b
$ Frame t2 -> Vector (Key t2)
forall (t :: (* -> *) -> *).
Indexable t =>
Frame t -> Vector (Key t)
index Frame t2
df2
fullIx :: Set k
fullIx = ([k] -> Set k
forall a. [a] -> Set a
Set.fromDistinctAscList ([k] -> Set k) -> [k] -> Set k
forall a b. (a -> b) -> a -> b
$ Vector k -> [k]
forall a. Vector a -> [a]
Data.Vector.toList Vector k
ix1)
Set k -> Set k -> Set k
forall a. Ord a => Set a -> Set a -> Set a
`Set.union`
([k] -> Set k
forall a. [a] -> Set a
Set.fromDistinctAscList ([k] -> Set k) -> [k] -> Set k
forall a b. (a -> b) -> a -> b
$ Vector k -> [k]
forall a. Vector a -> [a]
Data.Vector.toList Vector k
ix2)
fullLeft :: Vector (k, Maybe (Row t1))
fullLeft = Set k -> Vector (k, Row t1) -> Vector (k, Maybe (Row t1))
forall k (t :: (* -> *) -> *).
Ord k =>
Set k -> Vector (k, Row t) -> Vector (k, Maybe (Row t))
reindex Set k
fullIx (Vector k -> Vector (Row t1) -> Vector (k, Row t1)
forall a b. Vector a -> Vector b -> Vector (a, b)
Data.Vector.zip Vector k
ix1 (Frame t1 -> Vector (Row t1)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t1
df1))
fullRight :: Vector (k, Maybe (Row t2))
fullRight = Set k -> Vector (k, Row t2) -> Vector (k, Maybe (Row t2))
forall k (t :: (* -> *) -> *).
Ord k =>
Set k -> Vector (k, Row t) -> Vector (k, Maybe (Row t))
reindex Set k
fullIx (Vector k -> Vector (Row t2) -> Vector (k, Row t2)
forall a b. Vector a -> Vector b -> Vector (a, b)
Data.Vector.zip Vector k
ix2 (Frame t2 -> Vector (Row t2)
forall (t :: (* -> *) -> *).
Frameable t =>
Frame t -> Vector (Row t)
toRows Frame t2
df2))
in Vector (Row t3) -> Frame t3
forall (t :: (* -> *) -> *) (f :: * -> *).
(Frameable t, Foldable f) =>
f (Row t) -> Frame t
fromRows (Vector (Row t3) -> Frame t3) -> Vector (Row t3) -> Frame t3
forall a b. (a -> b) -> a -> b
$ Vector (Maybe (Row t3)) -> Vector (Row t3)
forall a. Vector (Maybe a) -> Vector a
Data.Vector.catMaybes
(Vector (Maybe (Row t3)) -> Vector (Row t3))
-> Vector (Maybe (Row t3)) -> Vector (Row t3)
forall a b. (a -> b) -> a -> b
$ ((k, Maybe (Row t1)) -> (k, Maybe (Row t2)) -> Maybe (Row t3))
-> Vector (k, Maybe (Row t1))
-> Vector (k, Maybe (Row t2))
-> Vector (Maybe (Row t3))
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
Data.Vector.zipWith (\(k, Maybe (Row t1))
t1 (k, Maybe (Row t2))
t2 -> MergeStrategy k t1 t2 t3
-> (k, These (Row t1) (Row t2)) -> Maybe (Row t3)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry MergeStrategy k t1 t2 t3
strat ((k, Maybe (Row t1))
-> (k, Maybe (Row t2)) -> (k, These (Row t1) (Row t2))
forall k a b.
Eq k =>
(k, Maybe a) -> (k, Maybe b) -> (k, These a b)
asThese (k, Maybe (Row t1))
t1 (k, Maybe (Row t2))
t2))
Vector (k, Maybe (Row t1))
fullLeft
Vector (k, Maybe (Row t2))
fullRight
where
asThese :: Eq k => (k, Maybe a) -> (k, Maybe b) -> (k, These a b)
asThese :: forall k a b.
Eq k =>
(k, Maybe a) -> (k, Maybe b) -> (k, These a b)
asThese (k
k1, Just a
a) (k
k2, Maybe b
Nothing) = Bool -> (k, These a b) -> (k, These a b)
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (k
k1k -> k -> Bool
forall a. Eq a => a -> a -> Bool
==k
k2) (k
k1, a -> These a b
forall a b. a -> These a b
This a
a)
asThese (k
k1, Maybe a
Nothing) (k
k2, Just b
b) = Bool -> (k, These a b) -> (k, These a b)
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (k
k1k -> k -> Bool
forall a. Eq a => a -> a -> Bool
==k
k2) (k
k1, b -> These a b
forall a b. b -> These a b
That b
b)
asThese (k
k1, Just a
a) (k
k2, Just b
b) = Bool -> (k, These a b) -> (k, These a b)
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (k
k1k -> k -> Bool
forall a. Eq a => a -> a -> Bool
==k
k2) (k
k1, a -> b -> These a b
forall a b. a -> b -> These a b
These a
a b
b)
asThese (k, Maybe a)
_ (k, Maybe b)
_ = [Char] -> (k, These a b)
forall a. (?callStack::CallStack) => [Char] -> a
error [Char]
"impossible"
reindex :: Ord k => Set.Set k -> Vector (k, Row t) -> Vector (k, Maybe (Row t))
reindex :: forall k (t :: (* -> *) -> *).
Ord k =>
Set k -> Vector (k, Row t) -> Vector (k, Maybe (Row t))
reindex Set k
fullix Vector (k, Row t)
vs = Int -> [(k, Maybe (Row t))] -> Vector (k, Maybe (Row t))
forall a. Int -> [a] -> Vector a
Data.Vector.fromListN (Set k -> Int
forall a. Set a -> Int
Set.size Set k
fullix)
([(k, Maybe (Row t))] -> Vector (k, Maybe (Row t)))
-> [(k, Maybe (Row t))] -> Vector (k, Maybe (Row t))
forall a b. (a -> b) -> a -> b
$ Seq (k, Maybe (Row t)) -> [(k, Maybe (Row t))]
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
Data.Foldable.toList
(Seq (k, Maybe (Row t)) -> [(k, Maybe (Row t))])
-> Seq (k, Maybe (Row t)) -> [(k, Maybe (Row t))]
forall a b. (a -> b) -> a -> b
$ Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
forall k (t :: (* -> *) -> *).
Ord k =>
Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
go Seq (k, Maybe (Row t))
forall a. Seq a
Empty
([k] -> Seq k
forall a. [a] -> Seq a
Seq.fromList ([k] -> Seq k) -> [k] -> Seq k
forall a b. (a -> b) -> a -> b
$ Set k -> [k]
forall a. Set a -> [a]
Set.toAscList Set k
fullix)
([(k, Row t)] -> Seq (k, Row t)
forall a. [a] -> Seq a
Seq.fromList ([(k, Row t)] -> Seq (k, Row t)) -> [(k, Row t)] -> Seq (k, Row t)
forall a b. (a -> b) -> a -> b
$ Vector (k, Row t) -> [(k, Row t)]
forall a. Vector a -> [a]
Data.Vector.toList Vector (k, Row t)
vs)
where
go :: Ord k
=> Seq (k, Maybe (Row t))
-> Seq k
-> Seq (k, Row t)
-> Seq (k, Maybe (Row t))
go :: forall k (t :: (* -> *) -> *).
Ord k =>
Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
go Seq (k, Maybe (Row t))
acc Seq k
Empty Seq (k, Row t)
_ = Seq (k, Maybe (Row t))
acc
go Seq (k, Maybe (Row t))
acc Seq k
keys Seq (k, Row t)
Empty = Seq (k, Maybe (Row t))
acc Seq (k, Maybe (Row t))
-> Seq (k, Maybe (Row t)) -> Seq (k, Maybe (Row t))
forall a. Seq a -> Seq a -> Seq a
Seq.>< (k -> (k, Maybe (Row t))) -> Seq k -> Seq (k, Maybe (Row t))
forall a b. (a -> b) -> Seq a -> Seq b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (, Maybe (Row t)
forall a. Maybe a
Nothing) Seq k
keys
go Seq (k, Maybe (Row t))
acc (k
k:<|Seq k
ks) queue :: Seq (k, Row t)
queue@((k
rk, Row t
row):<|Seq (k, Row t)
rs) = case k
k k -> k -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` k
rk of
Ordering
EQ -> Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
forall k (t :: (* -> *) -> *).
Ord k =>
Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
go (Seq (k, Maybe (Row t))
acc Seq (k, Maybe (Row t))
-> (k, Maybe (Row t)) -> Seq (k, Maybe (Row t))
forall a. Seq a -> a -> Seq a
Seq.|> (k
k, Row t -> Maybe (Row t)
forall a. a -> Maybe a
Just Row t
row)) Seq k
ks Seq (k, Row t)
rs
Ordering
LT -> Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
forall k (t :: (* -> *) -> *).
Ord k =>
Seq (k, Maybe (Row t))
-> Seq k -> Seq (k, Row t) -> Seq (k, Maybe (Row t))
go (Seq (k, Maybe (Row t))
acc Seq (k, Maybe (Row t))
-> (k, Maybe (Row t)) -> Seq (k, Maybe (Row t))
forall a. Seq a -> a -> Seq a
Seq.|> (k
k, Maybe (Row t)
forall a. Maybe a
Nothing)) Seq k
ks Seq (k, Row t)
queue
Ordering
GT -> [Char] -> Seq (k, Maybe (Row t))
forall a. (?callStack::CallStack) => [Char] -> a
error [Char]
"impossible"
type MergeStrategy k t1 t2 t3
= (k -> These (Row t1) (Row t2) -> Maybe (Row t3))
matchedStrategy :: (k -> Row t1 -> Row t2 -> Row t3)
-> MergeStrategy k t1 t2 t3
matchedStrategy :: forall k (t1 :: (* -> *) -> *) (t2 :: (* -> *) -> *)
(t3 :: (* -> *) -> *).
(k -> Row t1 -> Row t2 -> Row t3) -> MergeStrategy k t1 t2 t3
matchedStrategy k -> Row t1 -> Row t2 -> Row t3
f k
k (These Row t1
r1 Row t2
r2) = Row t3 -> Maybe (Row t3)
forall a. a -> Maybe a
Just (Row t3 -> Maybe (Row t3)) -> Row t3 -> Maybe (Row t3)
forall a b. (a -> b) -> a -> b
$ k -> Row t1 -> Row t2 -> Row t3
f k
k Row t1
r1 Row t2
r2
matchedStrategy k -> Row t1 -> Row t2 -> Row t3
_ k
_ These (Row t1) (Row t2)
_ = Maybe (Row t3)
forall a. Maybe a
Nothing
type family Column (f :: Type -> Type) x where
Column Identity x = x
Column f x = f x
type Row (dt :: (Type -> Type) -> Type) = dt Identity
type Frame (dt :: (Type -> Type) -> Type) = dt Vector
class GFromRows tI tV where
gfromRows :: Vector (tI a) -> (tV a)
instance GFromRows (Rec0 a) (Rec0 (Vector a)) where
gfromRows :: forall (a :: k). Vector (Rec0 a a) -> Rec0 (Vector a) a
gfromRows = Vector a -> K1 R (Vector a) a
forall k i c (p :: k). c -> K1 i c p
K1 (Vector a -> K1 R (Vector a) a)
-> (Vector (Rec0 a a) -> Vector a)
-> Vector (Rec0 a a)
-> K1 R (Vector a) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rec0 a a -> a) -> Vector (Rec0 a a) -> Vector a
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Rec0 a a -> a
forall k i c (p :: k). K1 i c p -> c
unK1
{-# INLINEABLE gfromRows #-}
instance (GFromRows tI1 tV1, GFromRows tI2 tV2)
=> GFromRows (tI1 :*: tI2) (tV1 :*: tV2) where
gfromRows :: forall (a :: k). Vector ((:*:) tI1 tI2 a) -> (:*:) tV1 tV2 a
gfromRows Vector ((:*:) tI1 tI2 a)
vs = let (Vector (tI1 a)
xs, Vector (tI2 a)
ys) = Vector (tI1 a, tI2 a) -> (Vector (tI1 a), Vector (tI2 a))
forall a b. Vector (a, b) -> (Vector a, Vector b)
Data.Vector.unzip (Vector (tI1 a, tI2 a) -> (Vector (tI1 a), Vector (tI2 a)))
-> Vector (tI1 a, tI2 a) -> (Vector (tI1 a), Vector (tI2 a))
forall a b. (a -> b) -> a -> b
$ ((:*:) tI1 tI2 a -> (tI1 a, tI2 a))
-> Vector ((:*:) tI1 tI2 a) -> Vector (tI1 a, tI2 a)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map (\(tI1 a
x :*: tI2 a
y) -> (tI1 a
x, tI2 a
y)) Vector ((:*:) tI1 tI2 a)
vs
in Vector (tI1 a) -> tV1 a
forall (a :: k). Vector (tI1 a) -> tV1 a
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GFromRows tI tV =>
Vector (tI a) -> tV a
gfromRows Vector (tI1 a)
xs tV1 a -> tV2 a -> (:*:) tV1 tV2 a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: Vector (tI2 a) -> tV2 a
forall (a :: k). Vector (tI2 a) -> tV2 a
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GFromRows tI tV =>
Vector (tI a) -> tV a
gfromRows Vector (tI2 a)
ys
{-# INLINEABLE gfromRows #-}
instance GFromRows tI tV => GFromRows (M1 i c tI) (M1 i c tV) where
gfromRows :: forall (a :: k). Vector (M1 i c tI a) -> M1 i c tV a
gfromRows Vector (M1 i c tI a)
vs = tV a -> M1 i c tV a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Vector (tI a) -> tV a
forall (a :: k). Vector (tI a) -> tV a
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GFromRows tI tV =>
Vector (tI a) -> tV a
gfromRows ((M1 i c tI a -> tI a) -> Vector (M1 i c tI a) -> Vector (tI a)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map M1 i c tI a -> tI a
forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1 Vector (M1 i c tI a)
vs))
{-# INLINEABLE gfromRows #-}
class GToRows tI tV where
gtoRows :: tV a -> Vector (tI a)
instance GToRows (Rec0 a) (Rec0 (Vector a)) where
gtoRows :: forall (a :: k). Rec0 (Vector a) a -> Vector (Rec0 a a)
gtoRows = (a -> Rec0 a a) -> Vector a -> Vector (Rec0 a a)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map a -> Rec0 a a
forall k i c (p :: k). c -> K1 i c p
K1 (Vector a -> Vector (Rec0 a a))
-> (Rec0 (Vector a) a -> Vector a)
-> Rec0 (Vector a) a
-> Vector (Rec0 a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec0 (Vector a) a -> Vector a
forall k i c (p :: k). K1 i c p -> c
unK1
{-# INLINEABLE gtoRows #-}
instance (GToRows tI1 tV1, GToRows tI2 tV2)
=> GToRows (tI1 :*: tI2) (tV1 :*: tV2) where
gtoRows :: forall (a :: k). (:*:) tV1 tV2 a -> Vector ((:*:) tI1 tI2 a)
gtoRows (tV1 a
xs :*: tV2 a
ys) = (tI1 a -> tI2 a -> (:*:) tI1 tI2 a)
-> Vector (tI1 a) -> Vector (tI2 a) -> Vector ((:*:) tI1 tI2 a)
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
Data.Vector.zipWith tI1 a -> tI2 a -> (:*:) tI1 tI2 a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:) (tV1 a -> Vector (tI1 a)
forall (a :: k). tV1 a -> Vector (tI1 a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GToRows tI tV =>
tV a -> Vector (tI a)
gtoRows tV1 a
xs) (tV2 a -> Vector (tI2 a)
forall (a :: k). tV2 a -> Vector (tI2 a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GToRows tI tV =>
tV a -> Vector (tI a)
gtoRows tV2 a
ys)
{-# INLINEABLE gtoRows #-}
instance (GToRows tI tV) => GToRows (M1 i c tI) (M1 i c tV) where
gtoRows :: forall (a :: k). M1 i c tV a -> Vector (M1 i c tI a)
gtoRows = (tI a -> M1 i c tI a) -> Vector (tI a) -> Vector (M1 i c tI a)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map tI a -> M1 i c tI a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Vector (tI a) -> Vector (M1 i c tI a))
-> (M1 i c tV a -> Vector (tI a))
-> M1 i c tV a
-> Vector (M1 i c tI a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. tV a -> Vector (tI a)
forall (a :: k). tV a -> Vector (tI a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GToRows tI tV =>
tV a -> Vector (tI a)
gtoRows (tV a -> Vector (tI a))
-> (M1 i c tV a -> tV a) -> M1 i c tV a -> Vector (tI a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1 i c tV a -> tV a
forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
{-# INLINEABLE gtoRows #-}
class GILookup tI tV where
gilookup :: Int -> tV a -> Maybe (tI a)
instance GILookup (Rec0 a) (Rec0 (Vector a)) where
gilookup :: forall (a :: k). Int -> Rec0 (Vector a) a -> Maybe (Rec0 a a)
gilookup Int
ix Rec0 (Vector a) a
vs = a -> K1 R a a
forall k i c (p :: k). c -> K1 i c p
K1 (a -> K1 R a a) -> Maybe a -> Maybe (K1 R a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Rec0 (Vector a) a -> Vector a
forall k i c (p :: k). K1 i c p -> c
unK1 Rec0 (Vector a) a
vs) Vector a -> Int -> Maybe a
forall a. Vector a -> Int -> Maybe a
Data.Vector.!? Int
ix
instance (GILookup tI1 tV1, GILookup tI2 tV2)
=> GILookup (tI1 :*: tI2) (tV1 :*: tV2) where
gilookup :: forall (a :: k). Int -> (:*:) tV1 tV2 a -> Maybe ((:*:) tI1 tI2 a)
gilookup Int
ix (tV1 a
xs :*: tV2 a
ys)
= tI1 a -> tI2 a -> (:*:) tI1 tI2 a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:)
(tI1 a -> tI2 a -> (:*:) tI1 tI2 a)
-> Maybe (tI1 a) -> Maybe (tI2 a -> (:*:) tI1 tI2 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int -> tV1 a -> Maybe (tI1 a)
forall (a :: k). Int -> tV1 a -> Maybe (tI1 a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GILookup tI tV =>
Int -> tV a -> Maybe (tI a)
gilookup Int
ix tV1 a
xs)
Maybe (tI2 a -> (:*:) tI1 tI2 a)
-> Maybe (tI2 a) -> Maybe ((:*:) tI1 tI2 a)
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int -> tV2 a -> Maybe (tI2 a)
forall (a :: k). Int -> tV2 a -> Maybe (tI2 a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GILookup tI tV =>
Int -> tV a -> Maybe (tI a)
gilookup Int
ix tV2 a
ys)
instance (GILookup tI tV) => GILookup (M1 i c tI) (M1 i c tV) where
gilookup :: forall (a :: k). Int -> M1 i c tV a -> Maybe (M1 i c tI a)
gilookup Int
ix = (tI a -> M1 i c tI a) -> Maybe (tI a) -> Maybe (M1 i c tI a)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap tI a -> M1 i c tI a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Maybe (tI a) -> Maybe (M1 i c tI a))
-> (M1 i c tV a -> Maybe (tI a))
-> M1 i c tV a
-> Maybe (M1 i c tI a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> tV a -> Maybe (tI a)
forall (a :: k). Int -> tV a -> Maybe (tI a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GILookup tI tV =>
Int -> tV a -> Maybe (tI a)
gilookup Int
ix (tV a -> Maybe (tI a))
-> (M1 i c tV a -> tV a) -> M1 i c tV a -> Maybe (tI a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1 i c tV a -> tV a
forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
class GFields r where
gfields :: r a -> [(String, String)]
instance GFields r => GFields (M1 D x r) where
gfields :: forall (a :: k). M1 D x r a -> [([Char], [Char])]
gfields = r a -> [([Char], [Char])]
forall (a :: k). r a -> [([Char], [Char])]
forall {k} (r :: k -> *) (a :: k).
GFields r =>
r a -> [([Char], [Char])]
gfields (r a -> [([Char], [Char])])
-> (M1 D x r a -> r a) -> M1 D x r a -> [([Char], [Char])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1 D x r a -> r a
forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
instance GFields t => GFields (M1 C x t) where
gfields :: forall (a :: k). M1 C x t a -> [([Char], [Char])]
gfields = t a -> [([Char], [Char])]
forall (a :: k). t a -> [([Char], [Char])]
forall {k} (r :: k -> *) (a :: k).
GFields r =>
r a -> [([Char], [Char])]
gfields (t a -> [([Char], [Char])])
-> (M1 C x t a -> t a) -> M1 C x t a -> [([Char], [Char])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1 C x t a -> t a
forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
instance (Show r, Selector s) => GFields (M1 S s (Rec0 r)) where
gfields :: forall (a :: k). M1 S s (Rec0 r) a -> [([Char], [Char])]
gfields (M1 (K1 r
r)) = [(M1 S s (Rec0 r) () -> [Char]
forall {k} (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
(f :: k1 -> *) (a :: k1).
Selector s =>
t s f a -> [Char]
forall k1 (t :: Meta -> (k1 -> *) -> k1 -> *) (f :: k1 -> *)
(a :: k1).
t s f a -> [Char]
selName (M1 S s (Rec0 r) ()
forall a. (?callStack::CallStack) => a
undefined :: M1 S s (Rec0 r) ()), r -> [Char]
forall a. Show a => a -> [Char]
show r
r)]
instance (GFields f, GFields g) => GFields (f :*: g) where
gfields :: forall (a :: k). (:*:) f g a -> [([Char], [Char])]
gfields (f a
x :*: g a
y) = f a -> [([Char], [Char])]
forall (a :: k). f a -> [([Char], [Char])]
forall {k} (r :: k -> *) (a :: k).
GFields r =>
r a -> [([Char], [Char])]
gfields f a
x [([Char], [Char])] -> [([Char], [Char])] -> [([Char], [Char])]
forall a. [a] -> [a] -> [a]
++ g a -> [([Char], [Char])]
forall (a :: k). g a -> [([Char], [Char])]
forall {k} (r :: k -> *) (a :: k).
GFields r =>
r a -> [([Char], [Char])]
gfields g a
y
class Frameable t where
pack :: Vector (Row t) -> Frame t
default pack :: ( Generic (Row t)
, Generic (Frame t)
, GFromRows (Rep (Row t)) (Rep (Frame t))
)
=> Vector (Row t)
-> Frame t
pack = Rep (Frame t) Any -> Frame t
forall a x. Generic a => Rep a x -> a
forall x. Rep (Frame t) x -> Frame t
to (Rep (Frame t) Any -> Frame t)
-> (Vector (Row t) -> Rep (Frame t) Any)
-> Vector (Row t)
-> Frame t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (Rep (Row t) Any) -> Rep (Frame t) Any
forall a. Vector (Rep (Row t) a) -> Rep (Frame t) a
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GFromRows tI tV =>
Vector (tI a) -> tV a
gfromRows (Vector (Rep (Row t) Any) -> Rep (Frame t) Any)
-> (Vector (Row t) -> Vector (Rep (Row t) Any))
-> Vector (Row t)
-> Rep (Frame t) Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Row t -> Rep (Row t) Any)
-> Vector (Row t) -> Vector (Rep (Row t) Any)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Row t -> Rep (Row t) Any
forall x. Row t -> Rep (Row t) x
forall a x. Generic a => a -> Rep a x
from
{-# INLINABLE pack #-}
unpack :: Frame t -> Vector (Row t)
default unpack :: ( Generic (Row t)
, Generic (Frame t)
, GToRows (Rep (Row t)) (Rep (Frame t))
)
=> Frame t
-> Vector (Row t)
unpack = (Rep (Row t) Any -> Row t)
-> Vector (Rep (Row t) Any) -> Vector (Row t)
forall a b. (a -> b) -> Vector a -> Vector b
Data.Vector.map Rep (Row t) Any -> Row t
forall a x. Generic a => Rep a x -> a
forall x. Rep (Row t) x -> Row t
to (Vector (Rep (Row t) Any) -> Vector (Row t))
-> (Frame t -> Vector (Rep (Row t) Any))
-> Frame t
-> Vector (Row t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rep (Frame t) Any -> Vector (Rep (Row t) Any)
forall a. Rep (Frame t) a -> Vector (Rep (Row t) a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GToRows tI tV =>
tV a -> Vector (tI a)
gtoRows (Rep (Frame t) Any -> Vector (Rep (Row t) Any))
-> (Frame t -> Rep (Frame t) Any)
-> Frame t
-> Vector (Rep (Row t) Any)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t -> Rep (Frame t) Any
forall x. Frame t -> Rep (Frame t) x
forall a x. Generic a => a -> Rep a x
from
{-# INLINABLE unpack #-}
iindex :: Int -> Frame t -> Maybe (Row t)
default iindex :: ( Generic (Frame t)
, Generic (Row t)
, GILookup (Rep (Row t)) (Rep (Frame t))
)
=> Int
-> Frame t
-> Maybe (Row t)
iindex Int
ix = (Rep (Row t) Any -> Row t)
-> Maybe (Rep (Row t) Any) -> Maybe (Row t)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rep (Row t) Any -> Row t
forall a x. Generic a => Rep a x -> a
forall x. Rep (Row t) x -> Row t
to (Maybe (Rep (Row t) Any) -> Maybe (Row t))
-> (Frame t -> Maybe (Rep (Row t) Any)) -> Frame t -> Maybe (Row t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Rep (Frame t) Any -> Maybe (Rep (Row t) Any)
forall a. Int -> Rep (Frame t) a -> Maybe (Rep (Row t) a)
forall {k} (tI :: k -> *) (tV :: k -> *) (a :: k).
GILookup tI tV =>
Int -> tV a -> Maybe (tI a)
gilookup Int
ix (Rep (Frame t) Any -> Maybe (Rep (Row t) Any))
-> (Frame t -> Rep (Frame t) Any)
-> Frame t
-> Maybe (Rep (Row t) Any)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Frame t -> Rep (Frame t) Any
forall x. Frame t -> Rep (Frame t) x
forall a x. Generic a => a -> Rep a x
from
fields :: Row t -> [(String, String)]
default fields :: ( Generic (Row t)
, GFields (Rep (Row t))
)
=> Row t
-> [(String, String)]
fields = Rep (Row t) Any -> [([Char], [Char])]
forall a. Rep (Row t) a -> [([Char], [Char])]
forall {k} (r :: k -> *) (a :: k).
GFields r =>
r a -> [([Char], [Char])]
gfields (Rep (Row t) Any -> [([Char], [Char])])
-> (Row t -> Rep (Row t) Any) -> Row t -> [([Char], [Char])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Row t -> Rep (Row t) Any
forall x. Row t -> Rep (Row t) x
forall a x. Generic a => a -> Rep a x
from
class ( Frameable t
, Eq (Key t)
, Ord (Key t)
) => Indexable t where
type Key t
index :: Frame t -> Vector (Key t)
data DisplayOptions t
= DisplayOptions
{ forall (t :: (* -> *) -> *). DisplayOptions t -> Int
maximumNumberOfRows :: Int
, forall (t :: (* -> *) -> *).
DisplayOptions t -> Row t -> [([Char], [Char])]
rowDisplayFunction :: Row t -> [(String, String)]
}
defaultDisplayOptions :: Frameable t => DisplayOptions t
defaultDisplayOptions :: forall (t :: (* -> *) -> *). Frameable t => DisplayOptions t
defaultDisplayOptions
= DisplayOptions { maximumNumberOfRows :: Int
maximumNumberOfRows = Int
6
, rowDisplayFunction :: Row t -> [([Char], [Char])]
rowDisplayFunction = Row t -> [([Char], [Char])]
forall (t :: (* -> *) -> *).
Frameable t =>
Row t -> [([Char], [Char])]
fields
}
display :: Frameable t
=> Frame t
-> String
display :: forall (t :: (* -> *) -> *). Frameable t => Frame t -> [Char]
display = DisplayOptions t -> Frame t -> [Char]
forall (t :: (* -> *) -> *).
Frameable t =>
DisplayOptions t -> Frame t -> [Char]
displayWith DisplayOptions t
forall (t :: (* -> *) -> *). Frameable t => DisplayOptions t
defaultDisplayOptions
displayWith :: (Frameable t)
=> DisplayOptions t
-> Frame t
-> String
displayWith :: forall (t :: (* -> *) -> *).
Frameable t =>
DisplayOptions t -> Frame t -> [Char]
displayWith DisplayOptions{Int
Row t -> [([Char], [Char])]
maximumNumberOfRows :: forall (t :: (* -> *) -> *). DisplayOptions t -> Int
rowDisplayFunction :: forall (t :: (* -> *) -> *).
DisplayOptions t -> Row t -> [([Char], [Char])]
maximumNumberOfRows :: Int
rowDisplayFunction :: Row t -> [([Char], [Char])]
..} Frame t
df
= if Frame t -> Bool
forall (t :: (* -> *) -> *). Frameable t => Frame t -> Bool
null Frame t
df
then [Char]
"<Empty dataframe>"
else [[([Char], [Char])]] -> [Char]
formatGrid [[([Char], [Char])]]
rows
where
len :: Int
len = Frame t -> Int
forall (t :: (* -> *) -> *). Frameable t => Frame t -> Int
length Frame t
df
n :: Int
n = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int
maximumNumberOfRows Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2)
headIxs :: Set Int
headIxs = [Int] -> Set Int
forall a. Ord a => [a] -> Set a
Set.fromList [Int
0 .. Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
tailIxs :: Set Int
tailIxs = [Int] -> Set Int
forall a. Ord a => [a] -> Set a
Set.fromList [Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n ..Int
len] Set Int -> Set Int -> Set Int
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set Int
headIxs
headRows :: [Row t]
headRows = [Maybe (Row t)] -> [Row t]
forall a. [Maybe a] -> [a]
catMaybes [Int -> Frame t -> Maybe (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Int -> Frame t -> Maybe (Row t)
ilookup Int
i Frame t
df | Int
i <- Set Int -> [Int]
forall a. Set a -> [a]
Set.toList Set Int
headIxs]
tailRows :: [Row t]
tailRows = [Maybe (Row t)] -> [Row t]
forall a. [Maybe a] -> [a]
catMaybes [Int -> Frame t -> Maybe (Row t)
forall (t :: (* -> *) -> *).
Frameable t =>
Int -> Frame t -> Maybe (Row t)
ilookup Int
j Frame t
df | Int
j <- Set Int -> [Int]
forall a. Set a -> [a]
Set.toList Set Int
tailIxs]
firstRow :: Row t
firstRow = case [Row t]
headRows of
[] -> [Char] -> Row t
forall a. (?callStack::CallStack) => [Char] -> a
error [Char]
"Impossible!"
[Row t
xs] -> Row t
xs
(Row t
xs:[Row t]
_) -> Row t
xs
spacerRow :: [[([Char], [Char])]]
spacerRow =
if Int
len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
maximumNumberOfRows
then [((([Char], [Char]) -> ([Char], [Char]))
-> [([Char], [Char])] -> [([Char], [Char])]
forall a b. (a -> b) -> [a] -> [b]
map (([Char] -> [Char]) -> ([Char], [Char]) -> ([Char], [Char])
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second ([Char] -> [Char] -> [Char]
forall a b. a -> b -> a
const [Char]
"...")) (Row t -> [([Char], [Char])]
forall (t :: (* -> *) -> *).
Frameable t =>
Row t -> [([Char], [Char])]
fields Row t
firstRow))]
else [[([Char], [Char])]]
forall a. Monoid a => a
mempty
rows :: [[([Char], [Char])]]
rows = (Row t -> [([Char], [Char])]
forall (t :: (* -> *) -> *).
Frameable t =>
Row t -> [([Char], [Char])]
fields (Row t -> [([Char], [Char])]) -> [Row t] -> [[([Char], [Char])]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Row t]
headRows) [[([Char], [Char])]]
-> [[([Char], [Char])]] -> [[([Char], [Char])]]
forall a. [a] -> [a] -> [a]
++ [[([Char], [Char])]]
spacerRow [[([Char], [Char])]]
-> [[([Char], [Char])]] -> [[([Char], [Char])]]
forall a. [a] -> [a] -> [a]
++ (Row t -> [([Char], [Char])]
forall (t :: (* -> *) -> *).
Frameable t =>
Row t -> [([Char], [Char])]
fields (Row t -> [([Char], [Char])]) -> [Row t] -> [[([Char], [Char])]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Row t]
tailRows)
([([Char], Int)]
headerLengths :: [(String, Int)]) = ((([Char], [Char]) -> ([Char], Int))
-> [([Char], [Char])] -> [([Char], Int)]
forall a b. (a -> b) -> [a] -> [b]
map (\([Char]
k, [Char]
_) -> ([Char]
k, [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
Prelude.length [Char]
k)) (Row t -> [([Char], [Char])]
forall (t :: (* -> *) -> *).
Frameable t =>
Row t -> [([Char], [Char])]
fields Row t
firstRow))
([([Char], Int)]
colWidths :: [(String, Int)])
= (([Char], Max Int) -> ([Char], Int))
-> [([Char], Max Int)] -> [([Char], Int)]
forall a b. (a -> b) -> [a] -> [b]
map ((Max Int -> Int) -> ([Char], Max Int) -> ([Char], Int)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second Max Int -> Int
forall a. Max a -> a
getMax)
([([Char], Max Int)] -> [([Char], Int)])
-> [([Char], Max Int)] -> [([Char], Int)]
forall a b. (a -> b) -> a -> b
$ ([([Char], Max Int)] -> [([Char], [Char])] -> [([Char], Max Int)])
-> [([Char], Max Int)]
-> [[([Char], [Char])]]
-> [([Char], Max Int)]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl'
(\[([Char], Max Int)]
acc [([Char], [Char])]
mp -> (([Char], Max Int) -> ([Char], Max Int) -> ([Char], Max Int))
-> [([Char], Max Int)]
-> [([Char], Max Int)]
-> [([Char], Max Int)]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\([Char]
k1, Max Int
v1) ([Char]
k2, Max Int
v2) -> ((Bool -> [Char] -> [Char]
forall a. (?callStack::CallStack) => Bool -> a -> a
assert ([Char]
k1 [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
k2) [Char]
k1, Max Int
v1 Max Int -> Max Int -> Max Int
forall a. Semigroup a => a -> a -> a
<> Max Int
v2))) [([Char], Max Int)]
acc ((([Char], [Char]) -> ([Char], Max Int))
-> [([Char], [Char])] -> [([Char], Max Int)]
forall a b. (a -> b) -> [a] -> [b]
map (([Char] -> Max Int) -> ([Char], [Char]) -> ([Char], Max Int)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (Int -> Max Int
forall a. a -> Max a
Max (Int -> Max Int) -> ([Char] -> Int) -> [Char] -> Max Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
Prelude.length)) [([Char], [Char])]
mp))
((([Char], Int) -> ([Char], Max Int))
-> [([Char], Int)] -> [([Char], Max Int)]
forall a b. (a -> b) -> [a] -> [b]
map ((Int -> Max Int) -> ([Char], Int) -> ([Char], Max Int)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second Int -> Max Int
forall a. a -> Max a
Max) [([Char], Int)]
headerLengths)
[[([Char], [Char])]]
rows
formatGrid :: [ [(String, String)]]
-> String
formatGrid :: [[([Char], [Char])]] -> [Char]
formatGrid [[([Char], [Char])]]
rs = [[Char]] -> [Char]
forall a. Monoid a => [a] -> a
mconcat ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
List.intersperse [Char]
"\n"
([[Char]] -> [[Char]]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> a -> b
$ [ [[Char]] -> [Char]
forall a. Monoid a => [a] -> a
mconcat ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
List.intersperse [Char]
" | " [ (Int -> [Char] -> [Char]
pad Int
w [Char]
k) | ([Char]
k, Int
w) <- [([Char], Int)]
colWidths]]
[[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [ [[Char]] -> [Char]
forall a. Monoid a => [a] -> a
mconcat ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
List.intersperse [Char]
" | " [ (Int -> [Char] -> [Char]
pad Int
w (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate Int
w Char
'-')) | ([Char]
_, Int
w) <- [([Char], Int)]
colWidths]]
[[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [ [[Char]] -> [Char]
forall a. Monoid a => [a] -> a
mconcat ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
List.intersperse [Char]
" | " [ (Int -> [Char] -> [Char]
pad Int
w [Char]
v)
| (([Char]
_, [Char]
v), ([Char]
_, Int
w)) <- [([Char], [Char])]
-> [([Char], Int)] -> [(([Char], [Char]), ([Char], Int))]
forall a b. [a] -> [b] -> [(a, b)]
zip [([Char], [Char])]
mp [([Char], Int)]
colWidths
]
| [([Char], [Char])]
mp <- [[([Char], [Char])]]
rs
]
where
pad :: Int -> String -> String
pad :: Int -> [Char] -> [Char]
pad Int
minNumChars [Char]
s
| Int
minNumChars Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
Prelude.length [Char]
s = [Char]
s
| Bool
otherwise = Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate (Int
minNumChars Int -> Int -> Int
forall a. Num a => a -> a -> a
- [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
Prelude.length [Char]
s) Char
' ' [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
s