{-# LANGUAGE ScopedTypeVariables #-}
module DataFrame.Operations.SetOps (
union,
intersect,
difference,
symmetricDifference,
) where
import Prelude hiding (filter)
import qualified Data.Vector.Unboxed as VU
import DataFrame.Internal.DataFrame (
DataFrame (..),
GroupedDataFrame (..),
columnNames,
)
import DataFrame.Operations.Aggregation (distinct, groupBy, selectIndices)
import DataFrame.Operations.Merge ()
union :: DataFrame -> DataFrame -> DataFrame
union :: DataFrame -> DataFrame -> DataFrame
union DataFrame
a DataFrame
b = DataFrame -> DataFrame
distinct (DataFrame
a DataFrame -> DataFrame -> DataFrame
forall a. Semigroup a => a -> a -> a
<> DataFrame
b)
intersect :: DataFrame -> DataFrame -> DataFrame
intersect :: DataFrame -> DataFrame -> DataFrame
intersect = (Bool -> Bool -> Bool) -> DataFrame -> DataFrame -> DataFrame
setOp Bool -> Bool -> Bool
(&&)
difference :: DataFrame -> DataFrame -> DataFrame
difference :: DataFrame -> DataFrame -> DataFrame
difference = (Bool -> Bool -> Bool) -> DataFrame -> DataFrame -> DataFrame
setOp (\Bool
inLeft Bool
inRight -> Bool
inLeft Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
inRight)
symmetricDifference :: DataFrame -> DataFrame -> DataFrame
symmetricDifference :: DataFrame -> DataFrame -> DataFrame
symmetricDifference DataFrame
a DataFrame
b = DataFrame -> DataFrame -> DataFrame
difference DataFrame
a DataFrame
b DataFrame -> DataFrame -> DataFrame
`union` DataFrame -> DataFrame -> DataFrame
difference DataFrame
b DataFrame
a
setOp :: (Bool -> Bool -> Bool) -> DataFrame -> DataFrame -> DataFrame
setOp :: (Bool -> Bool -> Bool) -> DataFrame -> DataFrame -> DataFrame
setOp Bool -> Bool -> Bool
keep DataFrame
a DataFrame
b =
Vector Int -> DataFrame -> DataFrame
selectIndices ([Int] -> Vector Int
forall a. Unbox a => [a] -> Vector a
VU.fromList [Int]
chosen) DataFrame
combined
where
leftRows :: Int
leftRows = (Int, Int) -> Int
forall a b. (a, b) -> a
fst (DataFrame -> (Int, Int)
dataframeDimensions DataFrame
a)
combined :: DataFrame
combined = DataFrame
a DataFrame -> DataFrame -> DataFrame
forall a. Semigroup a => a -> a -> a
<> DataFrame
b
Grouped DataFrame
_ [Text]
_ Vector Int
vis Vector Int
offs Vector Int
_ = [Text] -> DataFrame -> GroupedDataFrame
groupBy (DataFrame -> [Text]
columnNames DataFrame
combined) DataFrame
combined
nGroups :: Int
nGroups = Vector Int -> Int
forall a. Unbox a => Vector a -> Int
VU.length Vector Int
offs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
chosen :: [Int]
chosen =
[ Vector Int -> Int
forall a. Unbox a => Vector a -> a
VU.head Vector Int
members
| Int
k <- [Int
0 .. Int
nGroups Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
, let s :: Int
s = Vector Int -> Int -> Int
forall a. Unbox a => Vector a -> Int -> a
VU.unsafeIndex Vector Int
offs Int
k
e :: Int
e = Vector Int -> Int -> Int
forall a. Unbox a => Vector a -> Int -> a
VU.unsafeIndex Vector Int
offs (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
members :: Vector Int
members = Int -> Int -> Vector Int -> Vector Int
forall a. Unbox a => Int -> Int -> Vector a -> Vector a
VU.slice Int
s (Int
e Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
s) Vector Int
vis
inLeft :: Bool
inLeft = (Int -> Bool) -> Vector Int -> Bool
forall a. Unbox a => (a -> Bool) -> Vector a -> Bool
VU.any (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
leftRows) Vector Int
members
inRight :: Bool
inRight = (Int -> Bool) -> Vector Int -> Bool
forall a. Unbox a => (a -> Bool) -> Vector a -> Bool
VU.any (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
leftRows) Vector Int
members
, Bool -> Bool -> Bool
keep Bool
inLeft Bool
inRight
]