@@ -5,23 +5,24 @@ module Node.OS
55 , cpus
66 , Endianness (..), endianness
77 , freemem
8- , loadavg
98 , homedir
109 , hostname
10+ , loadavg
11+ , networkInterfaces
1112 , Platform (..), platform
1213 , release
1314 , tmpdir
1415 , totalmem
1516 , ostype
1617 , uptime
17- , networkInterfaces
18+ , userInfo
1819 ) where
1920
2021import Prelude
2122
2223import Data.Array ((!!))
23- import Data.Maybe (fromMaybe )
24- import Data.StrMap (StrMap )
24+ import Data.Maybe (Maybe (..), fromMaybe )
25+ import Data.StrMap (StrMap , update )
2526import Data.Time.Duration (Milliseconds , Seconds )
2627
2728import Control.Monad.Eff (Eff , kind Effect )
@@ -41,46 +42,12 @@ type CPU = { model :: String
4142 , idle :: Milliseconds
4243 , irq :: Milliseconds } }
4344
44- foreign import data OS :: Effect
45-
46- foreign import eol :: Char
47-
48- foreign import archImpl :: forall eff . Eff ( os :: OS | eff ) String
49-
50- foreign import cpus :: forall eff . Eff ( os :: OS | eff ) (Array CPU )
51-
52- foreign import endiannessImpl :: forall eff . Eff ( os :: OS | eff ) String
53-
54- foreign import freemem :: forall eff . Eff ( os :: OS | eff ) Number
55-
56- foreign import homedir :: forall eff . Eff ( os :: OS | eff ) String
57-
58- foreign import hostname :: forall eff . Eff ( os :: OS | eff ) String
59-
60- foreign import loadavgImpl :: forall eff . Eff ( os :: OS | eff ) (Array Number )
61-
62- foreign import platformImpl :: forall eff . Eff ( os :: OS | eff ) String
63-
64- foreign import release :: forall eff . Eff ( os :: OS | eff ) String
65-
66- foreign import tmpdir :: forall eff . Eff ( os :: OS | eff ) String
67-
68- foreign import totalmem :: forall eff . Eff ( os :: OS | eff ) Number
69-
70- foreign import ostype :: forall eff . Eff ( os :: OS | eff ) String
71-
72- foreign import uptime :: forall eff . Eff ( os :: OS | eff ) Seconds
73-
74- foreign import networkInterfaces :: forall eff . Eff ( os :: OS | eff ) (StrMap (Array NetworkInterface ))
45+ foreign import data OS :: Effect
7546
7647loadavg :: forall eff . Eff ( os :: OS | eff ) { one :: Number , five :: Number , fifteen :: Number }
7748loadavg = pure <<< fromMaybe {one: 0.0 , five: 0.0 , fifteen: 0.0 } <<< extract =<< loadavgImpl
7849 where
79- extract xs = do
80- one <- xs !! 0
81- five <- xs !! 1
82- fifteen <- xs !! 2
83- pure {one, five, fifteen}
50+ extract xs = {one: _, five: _, fifteen: _} <$> xs !! 0 <*> xs !! 1 <*> xs !! 2
8451
8552data Arch = X64 | ARM | IA32 | UnknownArch
8653
@@ -140,3 +107,39 @@ platform = do
140107 " freebsd" -> FreeBSD
141108 " sunos" -> SunOS
142109 _ -> UnknownPlatform
110+
111+ type UserInfo =
112+ { uid :: Int
113+ , gid :: Int
114+ , username :: String
115+ , homedir :: String
116+ , shell :: Maybe String
117+ }
118+
119+ userInfo :: forall eff . { encoding :: String } -> Eff ( os :: OS | eff ) UserInfo
120+ userInfo = userInfoImpl (flip update " shell" ) Nothing Just
121+
122+ foreign import eol :: Char
123+ foreign import archImpl :: forall eff . Eff ( os :: OS | eff ) String
124+ foreign import cpus :: forall eff . Eff ( os :: OS | eff ) (Array CPU )
125+ foreign import endiannessImpl :: forall eff . Eff ( os :: OS | eff ) String
126+ foreign import freemem :: forall eff . Eff ( os :: OS | eff ) Number
127+ foreign import homedir :: forall eff . Eff ( os :: OS | eff ) String
128+ foreign import hostname :: forall eff . Eff ( os :: OS | eff ) String
129+ foreign import loadavgImpl :: forall eff . Eff ( os :: OS | eff ) (Array Number )
130+ foreign import platformImpl :: forall eff . Eff ( os :: OS | eff ) String
131+ foreign import release :: forall eff . Eff ( os :: OS | eff ) String
132+ foreign import tmpdir :: forall eff . Eff ( os :: OS | eff ) String
133+ foreign import totalmem :: forall eff . Eff ( os :: OS | eff ) Number
134+ foreign import ostype :: forall eff . Eff ( os :: OS | eff ) String
135+ foreign import uptime :: forall eff . Eff ( os :: OS | eff ) Seconds
136+ foreign import networkInterfaces
137+ :: forall eff
138+ . Eff ( os :: OS | eff ) (StrMap (Array NetworkInterface ))
139+ foreign import userInfoImpl
140+ :: forall a eff
141+ . ((a -> Maybe a ) -> StrMap a -> StrMap a )
142+ -> Maybe a
143+ -> (a -> Maybe a )
144+ -> { encoding :: String }
145+ -> Eff ( os :: OS | eff ) UserInfo
0 commit comments