Commit 962046fb authored by Alexandre Delanoë's avatar Alexandre Delanoë

[TYPE] FlowCont (Flow Continuation) basic type

parent b32b1ee0
...@@ -17,36 +17,34 @@ module Gargantext.Core.Text.List ...@@ -17,36 +17,34 @@ module Gargantext.Core.Text.List
import Control.Lens ((^.), set, view, over) import Control.Lens ((^.), set, view, over)
import Data.Map (Map)
import Data.Maybe (fromMaybe, catMaybes) import Data.Maybe (fromMaybe, catMaybes)
import Data.Ord (Down(..)) import Data.Ord (Down(..))
import Data.Map (Map)
import Data.Set (Set) import Data.Set (Set)
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Char as Char
import qualified Data.List as List
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
-- import Gargantext.API.Ngrams.Tools (getCoocByNgrams', Diagonal(..))
import Gargantext.API.Ngrams.Types (NgramsElement, mkNgramsElement, NgramsTerm(..), RootParent(..), mSetFromList) import Gargantext.API.Ngrams.Types (NgramsElement, mkNgramsElement, NgramsTerm(..), RootParent(..), mSetFromList)
import Gargantext.API.Ngrams.Types (RepoCmdM) import Gargantext.API.Ngrams.Types (RepoCmdM)
import Gargantext.Core.Text.List.Social
import Gargantext.Core.Text.List.Social.Prelude
import Gargantext.Core.Text.List.Group import Gargantext.Core.Text.List.Group
import Gargantext.Core.Text.List.Group.WithStem import Gargantext.Core.Text.List.Group.WithStem
import Gargantext.Core.Text.List.Social
import Gargantext.Core.Text.List.Social.Prelude
import Gargantext.Core.Text.Metrics (scored', Scored(..), normalizeGlobal, normalizeLocal) import Gargantext.Core.Text.Metrics (scored', Scored(..), normalizeGlobal, normalizeLocal)
import Gargantext.Core.Types (ListType(..), MasterCorpusId, UserCorpusId) import Gargantext.Core.Types (ListType(..), MasterCorpusId, UserCorpusId)
import Gargantext.Core.Types.Individu (User(..)) import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Database.Admin.Types.Node (NodeId)
import Gargantext.Database.Action.Metrics.NgramsByNode (getNodesByNgramsUser, getNodesByNgramsOnlyUser) import Gargantext.Database.Action.Metrics.NgramsByNode (getNodesByNgramsUser, getNodesByNgramsOnlyUser)
import Gargantext.Database.Action.Metrics.TFICF (getTficf) import Gargantext.Database.Action.Metrics.TFICF (getTficf)
import Gargantext.Database.Admin.Types.Node (NodeId)
import Gargantext.Database.Prelude (CmdM) import Gargantext.Database.Prelude (CmdM)
import Gargantext.Database.Query.Table.Node (defaultList) import Gargantext.Database.Query.Table.Node (defaultList)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError()) import Gargantext.Database.Query.Table.Node.Error (HasNodeError())
import Gargantext.Database.Query.Tree.Error (HasTreeError) import Gargantext.Database.Query.Tree.Error (HasTreeError)
import Gargantext.Database.Schema.Ngrams (NgramsType(..)) import Gargantext.Database.Schema.Ngrams (NgramsType(..))
import Gargantext.Prelude import Gargantext.Prelude
import qualified Data.Char as Char
import qualified Data.List as List
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
-- | TODO improve grouping functions of Authors, Sources, Institutes.. -- | TODO improve grouping functions of Authors, Sources, Institutes..
...@@ -86,8 +84,8 @@ buildNgramsOthersList ::( HasNodeError err ...@@ -86,8 +84,8 @@ buildNgramsOthersList ::( HasNodeError err
buildNgramsOthersList user uCid groupIt (nt, MapListSize mapListSize) = do buildNgramsOthersList user uCid groupIt (nt, MapListSize mapListSize) = do
ngs' :: Map Text (Set NodeId) <- getNodesByNgramsUser uCid nt ngs' :: Map Text (Set NodeId) <- getNodesByNgramsUser uCid nt
socialLists' :: FlowListCont Text socialLists' :: FlowCont Text FlowListScores
<- flowSocialList' MySelfFirst user nt (FlowListCont Map.empty $ Set.fromList $ Map.keys ngs') <- flowSocialList' MySelfFirst user nt (FlowCont Map.empty $ Set.fromList $ Map.keys ngs')
-- PrivateFirst for first developments since Public NodeMode is not implemented yet -- PrivateFirst for first developments since Public NodeMode is not implemented yet
printDebug "flowSocialList'" printDebug "flowSocialList'"
......
...@@ -41,7 +41,7 @@ toGroupedText groupParams scores = ...@@ -41,7 +41,7 @@ toGroupedText groupParams scores =
(groupWithStem groupParams) . (groupWithScores scores) (groupWithStem groupParams) . (groupWithScores scores)
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | WIP, put this in test folder -- | TODO put in test folder
toGroupedText_test :: Bool -- Map Stem (GroupedText Int) toGroupedText_test :: Bool -- Map Stem (GroupedText Int)
toGroupedText_test = toGroupedText_test =
-- fromGroupedScores $ fromListScores from -- fromGroupedScores $ fromListScores from
...@@ -93,7 +93,7 @@ toGroupedText_test = ...@@ -93,7 +93,7 @@ toGroupedText_test =
] ]
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | To be removed -- | TODO To be removed
addListType :: Map Text ListType -> GroupedText a -> GroupedText a addListType :: Map Text ListType -> GroupedText a -> GroupedText a
addListType m g = set gt_listType (hasListType m g) g addListType m g = set gt_listType (hasListType m g) g
where where
......
...@@ -80,6 +80,19 @@ groupWithScores scores ms = orphans <> groups ...@@ -80,6 +80,19 @@ groupWithScores scores ms = orphans <> groups
orphans = addIfNotExist scores ms orphans = addIfNotExist scores ms
{-
groupWithScores :: Map Text FlowListScores
-> Map Text (Set NodeId)
-> Map Text (GroupedTextScores (Set NodeId))
groupWithScores scores ms = orphans <> groups
where
groups = addScore ms
$ fromGroupedScores
$ fromListScores scores
orphans = addIfNotExist scores ms
-}
------------------------------------------------------------------------ ------------------------------------------------------------------------
addScore :: Map Text (Set NodeId) addScore :: Map Text (Set NodeId)
-> Map Text (GroupedTextScores (Set NodeId)) -> Map Text (GroupedTextScores (Set NodeId))
...@@ -108,12 +121,10 @@ addIfNotExist mapSocialScores mapScores = ...@@ -108,12 +121,10 @@ addIfNotExist mapSocialScores mapScores =
add _ _ = Nothing -- should not be present add _ _ = Nothing -- should not be present
------------------------------------------------------------------------ ------------------------------------------------------------------------
{-
toGroupedTextScores' :: Map Parent GroupedWithListScores toGroupedTextScores' :: Map Parent GroupedWithListScores
-> Map Text (Set NodeId) -- -> Map Text (Set NodeId)
-> Map Parent (GroupedTextScores' (Set NodeId)) -> Map Parent (GroupedTextScores' (Set NodeId))
toGroupedTextScores' par datas = undefined toGroupedTextScores' par = undefined
-}
------------------------------------------------------------------------ ------------------------------------------------------------------------
fromGroupedScores :: Map Parent GroupedWithListScores fromGroupedScores :: Map Parent GroupedWithListScores
......
...@@ -62,45 +62,44 @@ flowSocialList' :: ( RepoCmdM env err m ...@@ -62,45 +62,44 @@ flowSocialList' :: ( RepoCmdM env err m
) )
=> FlowSocialListPriority => FlowSocialListPriority
-> User -> NgramsType -> User -> NgramsType
-> FlowListCont Text -> FlowCont Text FlowListScores
-> m (FlowListCont Text) -> m (FlowCont Text FlowListScores)
flowSocialList' flowPriority user nt flc = flowSocialList' flowPriority user nt flc =
mconcat <$> mapM (flowSocialListByMode' user nt flc) mconcat <$> mapM (flowSocialListByMode' user nt flc)
(flowSocialListPriority flowPriority) (flowSocialListPriority flowPriority)
where
------------------------------------------------------------------------
flowSocialListByMode' :: ( RepoCmdM env err m
flowSocialListByMode' :: ( RepoCmdM env err m , CmdM env err m
, CmdM env err m , HasNodeError err
, HasNodeError err , HasTreeError err
, HasTreeError err )
) => User -> NgramsType
=> User -> NgramsType -> FlowCont Text FlowListScores
-> FlowListCont Text -> NodeMode
-> NodeMode -> m (FlowCont Text FlowListScores)
-> m (FlowListCont Text) flowSocialListByMode' user' nt' flc' mode =
flowSocialListByMode' user nt flc mode = findListsId user' mode
findListsId user mode >>= flowSocialListByModeWith nt' flc'
>>= flowSocialListByModeWith nt flc
flowSocialListByModeWith :: ( RepoCmdM env err m
flowSocialListByModeWith :: ( RepoCmdM env err m , CmdM env err m
, CmdM env err m , HasNodeError err
, HasNodeError err , HasTreeError err
, HasTreeError err )
) => NgramsType
=> NgramsType -> FlowCont Text FlowListScores
-> FlowListCont Text -> [NodeId]
-> [NodeId] -> m (FlowCont Text FlowListScores)
-> m (FlowListCont Text) flowSocialListByModeWith nt'' flc'' ns =
flowSocialListByModeWith nt flc ns = mapM (\l -> getListNgrams [l] nt'') ns
mapM (\l -> getListNgrams [l] nt) ns >>= pure
>>= pure . toFlowListScores (keepAllParents nt'') flc''
. toFlowListScores (keepAllParents nt) flc
---8<-TODO-REMOVE ALL BELOW--8<--8<-- 8<-- 8<--8<--8<--
---8<-TODO-ALL BELOW--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-
-- | Choice depends on Ord instance of ListType -- | Choice depends on Ord instance of ListType
-- for now : data ListType = StopTerm | CandidateTerm | MapTerm -- for now : data ListType = StopTerm | CandidateTerm | MapTerm
......
...@@ -35,20 +35,20 @@ import qualified Data.Set as Set ...@@ -35,20 +35,20 @@ import qualified Data.Set as Set
type Parent = Text type Parent = Text
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | DataType inspired by continuation Monad (but simpler) -- | DataType inspired by continuation Monad (but simpler)
data FlowListCont a = data FlowCont a b =
FlowListCont { _flc_scores :: Map a FlowListScores FlowCont { _flc_scores :: Map a b
, _flc_cont :: Set a , _flc_cont :: Set a
} }
instance Ord a => Monoid (FlowListCont a) where instance Ord a => Monoid (FlowCont a b) where
mempty = FlowListCont Map.empty Set.empty mempty = FlowCont Map.empty Set.empty
instance (Eq a, Ord a) => Semigroup (FlowListCont a) where instance (Eq a, Ord a) => Semigroup (FlowCont a b) where
(<>) (FlowListCont m1 s1) (<>) (FlowCont m1 s1)
(FlowListCont m2 s2) (FlowCont m2 s2)
| s1 == Set.empty = FlowListCont m s2 | s1 == Set.empty = FlowCont m s2
| s2 == Set.empty = FlowListCont m s1 | s2 == Set.empty = FlowCont m s1
| otherwise = FlowListCont m (Set.intersection s1 s2) | otherwise = FlowCont m (Set.intersection s1 s2)
where where
m = Map.union m1 m2 m = Map.union m1 m2
...@@ -64,7 +64,7 @@ data FlowListScores = ...@@ -64,7 +64,7 @@ data FlowListScores =
------------------------------------------------------------------------ ------------------------------------------------------------------------
makeLenses ''FlowListCont makeLenses ''FlowCont
makeLenses ''FlowListScores makeLenses ''FlowListScores
-- | Rules to compose 2 datatype FlowListScores -- | Rules to compose 2 datatype FlowListScores
......
...@@ -32,18 +32,18 @@ import qualified Data.Set as Set ...@@ -32,18 +32,18 @@ import qualified Data.Set as Set
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | Generates Score from list of Map Text NgramsRepoElement -- | Generates Score from list of Map Text NgramsRepoElement
toFlowListScores :: KeepAllParents toFlowListScores :: KeepAllParents
-> FlowListCont Text -> FlowCont Text FlowListScores
-> [Map Text NgramsRepoElement] -> [Map Text NgramsRepoElement]
-> FlowListCont Text -> FlowCont Text FlowListScores
toFlowListScores k flc_origin = foldl' (toFlowListScores_Level1 k flc_origin) mempty toFlowListScores k flc_origin = foldl' (toFlowListScores_Level1 k flc_origin) mempty
where where
toFlowListScores_Level1 :: KeepAllParents toFlowListScores_Level1 :: KeepAllParents
-> FlowListCont Text -> FlowCont Text FlowListScores
-> FlowListCont Text -> FlowCont Text FlowListScores
-> Map Text NgramsRepoElement -> Map Text NgramsRepoElement
-> FlowListCont Text -> FlowCont Text FlowListScores
toFlowListScores_Level1 k' flc_origin' flc_dest ngramsRepo = toFlowListScores_Level1 k' flc_origin' flc_dest ngramsRepo =
Set.foldl' (toFlowListScores_Level2 k' ngramsRepo flc_origin') Set.foldl' (toFlowListScores_Level2 k' ngramsRepo flc_origin')
flc_dest flc_dest
...@@ -52,10 +52,10 @@ toFlowListScores k flc_origin = foldl' (toFlowListScores_Level1 k flc_origin) me ...@@ -52,10 +52,10 @@ toFlowListScores k flc_origin = foldl' (toFlowListScores_Level1 k flc_origin) me
toFlowListScores_Level2 :: KeepAllParents toFlowListScores_Level2 :: KeepAllParents
-> Map Text NgramsRepoElement -> Map Text NgramsRepoElement
-> FlowListCont Text -> FlowCont Text FlowListScores
-> FlowListCont Text -> FlowCont Text FlowListScores
-> Text -> Text
-> FlowListCont Text -> FlowCont Text FlowListScores
toFlowListScores_Level2 k'' ngramsRepo flc_origin'' flc_dest' t = toFlowListScores_Level2 k'' ngramsRepo flc_origin'' flc_dest' t =
case Map.lookup t ngramsRepo of case Map.lookup t ngramsRepo of
Nothing -> over flc_cont (Set.insert t) flc_dest' Nothing -> over flc_cont (Set.insert t) flc_dest'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment