@@ -2,18 +2,20 @@ module Data.Query where
2
2
3
3
import Prelude
4
4
5
- import Control.Monad.Reader.Class (ask )
5
+ import Control.Monad.Reader.Class (asks )
6
6
import Control.Monad.Reader.Trans (ReaderT )
7
7
import Data.DataFrame (DataFrame (..))
8
8
import Data.Filterable (filter ) as Filterable
9
+ import Data.Foldable (foldr )
9
10
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 )
14
14
import Data.Newtype (over )
15
15
import Data.Ordering (invert )
16
16
import Data.Symbol (class IsSymbol , SProxy (..))
17
+ import Data.Tuple (snd )
18
+ import Data.Tuple.Nested (type (/\))
17
19
import Prim.Row (class Cons , class Lacks )
18
20
import Prim.RowList (class RowToList , Cons , Nil , kind RowList )
19
21
import Record (get , insert )
@@ -23,7 +25,7 @@ import Type.Row (class ListToRow, RLProxy(..), RProxy)
23
25
type Query m a b = ReaderT (DataFrame a ) m (DataFrame b )
24
26
25
27
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)
27
29
28
30
arrange
29
31
:: ∀ m sym a rec without
@@ -35,7 +37,7 @@ arrange
35
37
=> SProxy sym
36
38
-> Boolean
37
39
-> 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)))
39
41
where
40
42
comp :: a -> a -> Ordering
41
43
comp a = if asc then compare a else invert <<< compare a
49
51
=> Cons sym a without rec
50
52
=> SProxy sym
51
53
-> Query m { |rec } a
52
- pull proxy = (over DataFrame $ map (( get proxy))) <$> ask
54
+ pull proxy = asks (over DataFrame $ map ( get proxy))
53
55
54
56
class RowSubset (row :: # Type ) (xs :: RowList ) (subrow :: # Type ) | row xs -> subrow where
55
57
subsetImpl :: RLProxy xs -> { |row } -> { |subrow }
84
86
=> ListToRow rl subR
85
87
=> RProxy subR
86
88
-> Query m { |rec } { |subR }
87
- select proxy = (map (flip subsetRow proxy)) <$> ask
89
+ select proxy = asks (map (flip subsetRow proxy))
88
90
89
91
rename
90
92
:: ∀ m inter input output sym sym' a
@@ -98,7 +100,7 @@ rename
98
100
=> SProxy sym
99
101
-> SProxy sym'
100
102
-> Query m { |input } { |output }
101
- rename proxy proxy' = (map (R .rename proxy proxy')) <$> ask
103
+ rename proxy proxy' = asks (map (R .rename proxy proxy'))
102
104
103
105
mutate
104
106
:: ∀ m input output sym a
@@ -109,7 +111,7 @@ mutate
109
111
=> SProxy sym
110
112
-> ({ |input } -> a )
111
113
-> 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))
113
115
114
116
transmute
115
117
:: ∀ m input sym a out
@@ -120,7 +122,32 @@ transmute
120
122
=> SProxy sym
121
123
-> ({ |input } -> a )
122
124
-> 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) {})
124
126
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