Skip to content

Commit 253bf03

Browse files
committed
Few more functions
1 parent 18c1aa1 commit 253bf03

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

src/Data/DataFrame.purs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Prelude
44

55
import Data.Compactable (class Compactable, separate)
66
import Data.Filterable (class Filterable, partitionMap)
7+
import Data.Function (on)
78
import Data.Generic.Rep (class Generic)
89
import Data.List (catMaybes, mapMaybe, partition)
910
import Data.List (filter) as List
@@ -19,7 +20,7 @@ derive instance genericDF :: Generic (DataFrame a) _
1920
derive instance functorDF :: Functor DataFrame
2021

2122
instance semigroupDF :: Semigroup (DataFrame a) where
22-
append (DataFrame l1) (DataFrame l2) = wrap $ append l1 l2
23+
append df1 = wrap <<< on append unwrap df1
2324

2425
instance monoidDF :: Monoid (DataFrame a) where
2526
mempty = wrap mempty

src/Data/Query.purs

+41-14
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ module Data.Query where
22

33
import Prelude
44

5-
import Control.Monad.Reader.Class (ask)
5+
import Control.Monad.Reader.Class (asks)
66
import Control.Monad.Reader.Trans (ReaderT)
77
import Data.DataFrame (DataFrame(..))
88
import Data.Filterable (filter) as Filterable
9+
import Data.Foldable (foldr)
910
import Data.Function (on)
10-
import Data.List (sortBy)
11-
import Data.List.Lazy (List, uncons, (:))
12-
import Data.List.Lazy (filter) as L
13-
import Data.Maybe (maybe)
11+
import Data.List (List, sortBy, (:))
12+
import Data.Map (alter, empty, toUnfoldable) as Map
13+
import Data.Maybe (Maybe(..), maybe)
1414
import Data.Newtype (over)
1515
import Data.Ordering (invert)
1616
import Data.Symbol (class IsSymbol, SProxy(..))
17+
import Data.Tuple (snd)
18+
import Data.Tuple.Nested (type (/\))
1719
import Prim.Row (class Cons, class Lacks)
1820
import Prim.RowList (class RowToList, Cons, Nil, kind RowList)
1921
import Record (get, insert)
@@ -23,7 +25,7 @@ import Type.Row (class ListToRow, RLProxy(..), RProxy)
2325
type Query m a b = ReaderT (DataFrame a) m (DataFrame b)
2426

2527
filter :: m a. Monad m => (a -> Boolean) -> Query m a a
26-
filter f = (Filterable.filter f) <$> ask
28+
filter f = asks (Filterable.filter f)
2729

2830
arrange
2931
:: m sym a rec without
@@ -35,7 +37,7 @@ arrange
3537
=> SProxy sym
3638
-> Boolean
3739
-> Query m ({|rec}) ({|rec})
38-
arrange proxy asc = (over DataFrame $ sortBy (comp `on` (get proxy))) <$> ask
40+
arrange proxy asc = asks (over DataFrame $ sortBy (comp `on` (get proxy)))
3941
where
4042
comp :: a -> a -> Ordering
4143
comp a = if asc then compare a else invert <<< compare a
@@ -49,7 +51,7 @@ pull
4951
=> Cons sym a without rec
5052
=> SProxy sym
5153
-> Query m {|rec} a
52-
pull proxy = (over DataFrame $ map (( get proxy))) <$> ask
54+
pull proxy = asks (over DataFrame $ map ( get proxy))
5355

5456
class RowSubset (row :: # Type) (xs :: RowList) (subrow :: # Type) | row xs -> subrow where
5557
subsetImpl :: RLProxy xs -> {|row} -> {|subrow}
@@ -84,7 +86,7 @@ select
8486
=> ListToRow rl subR
8587
=> RProxy subR
8688
-> Query m {|rec} {|subR}
87-
select proxy = (map (flip subsetRow proxy)) <$> ask
89+
select proxy = asks (map (flip subsetRow proxy))
8890

8991
rename
9092
:: m inter input output sym sym' a
@@ -98,7 +100,7 @@ rename
98100
=> SProxy sym
99101
-> SProxy sym'
100102
-> Query m {|input} {|output}
101-
rename proxy proxy' = (map (R.rename proxy proxy')) <$> ask
103+
rename proxy proxy' = asks (map (R.rename proxy proxy'))
102104

103105
mutate
104106
:: m input output sym a
@@ -109,7 +111,7 @@ mutate
109111
=> SProxy sym
110112
-> ({|input} -> a)
111113
-> Query m {|input} {|output}
112-
mutate proxy f = (map (\r -> R.insert proxy (f r) r)) <$> ask
114+
mutate proxy f = asks (map (\r -> R.insert proxy (f r) r))
113115

114116
transmute
115117
:: m input sym a out
@@ -120,7 +122,32 @@ transmute
120122
=> SProxy sym
121123
-> ({|input} -> a)
122124
-> Query m {|input} {|out}
123-
transmute proxy f = (map \r -> R.insert proxy (f r) {}) <$> ask
125+
transmute proxy f = asks (map \r -> R.insert proxy (f r) {})
124126

125-
sort :: a. Ord a => List a -> List a
126-
sort xs = maybe mempty (\{ head, tail } -> (sort $ L.filter (_ <= head) tail) <> (head : (sort $ L.filter (_ > head) tail))) $ uncons xs
127+
groupBy
128+
:: m a b
129+
. Monad m
130+
=> Ord b
131+
=> (a -> b)
132+
-> Query m a (b /\ (List a))
133+
groupBy f = asks go
134+
where
135+
go =
136+
over DataFrame $
137+
foldr
138+
(\a -> Map.alter (Just <<< maybe (pure a) (a : _)) (f a))
139+
Map.empty
140+
>>> Map.toUnfoldable
141+
142+
summarise
143+
:: m a b c
144+
. Monad m
145+
=> (List a -> c)
146+
-> Query m (b /\ (List a)) (b /\ c)
147+
summarise f = asks (over DataFrame (map (map f)))
148+
149+
ungroup
150+
:: m a b
151+
. Monad m
152+
=> Query m (b /\ (List a)) a
153+
ungroup = asks (over DataFrame (map snd >>> join))

0 commit comments

Comments
 (0)