@@ -2,43 +2,47 @@ module Hyper.Node.Session.InMemory where
22
33import Prelude
44
5- import Control.Monad.Aff (Aff )
6- import Control.Monad.Aff.AVar (AVAR , AVar , makeVar , putVar , readVar , takeVar )
7- import Control.Monad.Aff.Class (class MonadAff , liftAff )
8- import Control.Monad.Aff.Console (CONSOLE , log )
5+ import Control.Monad.Eff.Class (class MonadEff , liftEff )
6+ import Control.Monad.Eff (Eff )
7+ import Control.Monad.Eff.Console (CONSOLE , log )
8+ import Control.Monad.Eff.Random (RANDOM )
9+ import Control.Monad.Eff.Ref (REF , Ref , modifyRef , newRef , readRef )
910import Data.Map (Map )
1011import Data.Map as Map
1112import Data.Newtype (unwrap )
1213import Hyper.Session (class SessionStore , SessionID (..))
1314
14- data InMemorySessionStore session = InMemorySessionStore (AVar (Map SessionID session ))
15+ data InMemorySessionStore session = InMemorySessionStore (Ref (Map SessionID session ))
16+
17+ foreign import generatedSessionID :: forall eff . Eff (random :: RANDOM | eff ) String
1518
1619instance sessionStoreInMemorySessionStore :: ( Monad m
17- , MonadAff ( avar :: AVAR , console :: CONSOLE | e ) m
20+ , MonadEff ( ref :: REF , console :: CONSOLE , random :: RANDOM | e ) m
1821 )
1922 => SessionStore
2023 (InMemorySessionStore session )
2124 m
2225 session where
23- newSessionID _ =
24- pure (SessionID " new-id" )
26+ newSessionID _ = do
27+ id <- liftEff generatedSessionID
28+ pure (SessionID id)
2529
2630 get (InMemorySessionStore var) id =
27- liftAff do
31+ liftEff do
2832 log (" Looking up session: " <> show (unwrap id))
29- Map .lookup id <$> readVar var
33+ Map .lookup id <$> readRef var
3034
3135 put (InMemorySessionStore var) id session = do
32- liftAff do
36+ liftEff do
3337 log (" Saving session: " <> unwrap id)
34- Map .insert id session <$> takeVar var >>= flip putVar var
38+ modifyRef var $ Map .insert id session
3539
3640 delete (InMemorySessionStore var) id = do
37- liftAff do
41+ liftEff do
3842 log (" Deleting session: " <> unwrap id)
39- Map .delete id <$> takeVar var >>= flip putVar var
43+ modifyRef var $ Map .delete id
4044
4145newInMemorySessionStore
4246 :: forall e session
43- . Aff ( avar ∷ AVAR | e ) (InMemorySessionStore session )
44- newInMemorySessionStore = InMemorySessionStore <$> makeVar Map .empty
47+ . Eff ( ref ∷ REF | e ) (InMemorySessionStore session )
48+ newInMemorySessionStore = InMemorySessionStore <$> newRef Map .empty
0 commit comments