@@ -16,36 +16,47 @@ module Node.OS
1616 , totalmem
1717 , ostype
1818 , uptime
19- , userInfo
19+ , userInfo , BufferEncoding (..)
2020 ) where
2121
2222import Prelude
23-
23+
2424import Data.Array ((!!))
25+ import Data.Either (Either (..))
2526import Data.Maybe (Maybe (..), fromMaybe )
2627import Data.Time.Duration (Milliseconds , Seconds )
27- import Foreign.Object (Object , update )
2828import Effect (Effect )
29+ import Foreign.Object (Object , update )
30+ import Node.Encoding (Encoding )
2931
30- type NetworkInterface = { address :: String
31- , netmask :: String
32- , family :: String
33- , mac :: String
34- , internal :: Boolean
35- }
36-
37- type CPU = { model :: String
38- , speed :: Int
39- , times :: { user :: Milliseconds
40- , nice :: Milliseconds
41- , sys :: Milliseconds
42- , idle :: Milliseconds
43- , irq :: Milliseconds } }
32+ type NetworkInterface =
33+ { address :: String
34+ , netmask :: String
35+ , family :: String
36+ , mac :: String
37+ , internal :: Boolean
38+ }
39+
40+ type CPU =
41+ { model :: String
42+ , speed :: Int
43+ , times ::
44+ { user :: Milliseconds
45+ , nice :: Milliseconds
46+ , sys :: Milliseconds
47+ , idle :: Milliseconds
48+ , irq :: Milliseconds
49+ }
50+ }
4451
4552loadavg :: Effect { one :: Number , five :: Number , fifteen :: Number }
46- loadavg = pure <<< fromMaybe {one: 0.0 , five: 0.0 , fifteen: 0.0 } <<< extract =<< loadavgImpl
53+ loadavg = fromMaybe {one: 0.0 , five: 0.0 , fifteen: 0.0 } <<< extract <$> loadavgImpl
4754 where
48- extract xs = {one: _, five: _, fifteen: _} <$> xs !! 0 <*> xs !! 1 <*> xs !! 2
55+ extract xs = ado
56+ one <- xs !! 0
57+ five <- xs !! 1
58+ fifteen <- xs !! 2
59+ in {one, five, fifteen}
4960
5061data Arch = X64 | ARM | IA32 | UnknownArch
5162
@@ -61,10 +72,10 @@ arch :: Effect Arch
6172arch = do
6273 a <- archImpl
6374 pure case a of
64- " x64" -> X64
65- " arm" -> ARM
66- " ia32" -> IA32
67- _ -> UnknownArch
75+ " x64" -> X64
76+ " arm" -> ARM
77+ " ia32" -> IA32
78+ _ -> UnknownArch
6879
6980data Endianness = LittleEndian | BigEndian | UnknownEndian
7081
@@ -79,33 +90,34 @@ endianness :: Effect Endianness
7990endianness = do
8091 e <- endiannessImpl
8192 pure case e of
82- " BE" -> BigEndian
83- " LE" -> LittleEndian
84- _ -> UnknownEndian
93+ " BE" -> BigEndian
94+ " LE" -> LittleEndian
95+ _ -> UnknownEndian
8596
8697data Platform = Darwin | FreeBSD | Linux | SunOS | Win32 | UnknownPlatform
8798
8899derive instance eqPlatform :: Eq Platform
89100
90101instance showPlatform :: Show Platform where
91- show Darwin = " Darwin"
92- show FreeBSD = " FreeBSD"
93- show Linux = " Linux"
94- show SunOS = " SunOS"
95- show Win32 = " Win32"
96- show UnknownPlatform = " UnknownPlatform"
102+ show = case _ of
103+ Darwin -> " Darwin"
104+ FreeBSD -> " FreeBSD"
105+ Linux -> " Linux"
106+ SunOS -> " SunOS"
107+ Win32 -> " Win32"
108+ UnknownPlatform -> " UnknownPlatform"
97109
98110platform :: Effect Platform
99111platform = do
100112 p <- platformImpl
101113 pure case p of
102- " linux" -> Linux
103- " darwin" -> Darwin
104- " win32" -> Win32
105- " freebsd" -> FreeBSD
106- " sunos" -> SunOS
107- _ -> UnknownPlatform
108-
114+ " linux" -> Linux
115+ " darwin" -> Darwin
116+ " win32" -> Win32
117+ " freebsd" -> FreeBSD
118+ " sunos" -> SunOS
119+ _ -> UnknownPlatform
120+
109121type UserInfo =
110122 { uid :: Int
111123 , gid :: Int
@@ -114,8 +126,14 @@ type UserInfo =
114126 , shell :: Maybe String
115127 }
116128
117- userInfo :: { encoding :: String } -> Effect UserInfo
118- userInfo = userInfoImpl (flip update " shell" ) Nothing Just
129+ userInfo :: Either Encoding BufferEncoding -> Effect UserInfo
130+ userInfo enc = userInfoImpl (update <@> " shell" ) Nothing Just enc'
131+ where
132+ enc' = case enc of
133+ Left e -> {encoding: show e}
134+ _ -> {encoding: " buffer" }
135+
136+ data BufferEncoding = BufferEncoding
119137
120138foreign import eol :: Char
121139foreign import archImpl :: Effect String
@@ -131,12 +149,10 @@ foreign import tmpdir :: Effect String
131149foreign import totalmem :: Effect Number
132150foreign import ostype :: Effect String
133151foreign import uptime :: Effect Seconds
134- foreign import networkInterfaces
135- :: Effect (Object (Array NetworkInterface ))
152+ foreign import networkInterfaces :: Effect (Object (Array NetworkInterface ))
136153foreign import userInfoImpl
137- :: forall a
138- . ((a -> Maybe a ) -> Object a -> Object a )
139- -> Maybe a
140- -> (a -> Maybe a )
154+ :: (∀ a . (a -> Maybe a ) -> Object a -> Object a )
155+ -> (∀ a . Maybe a )
156+ -> (∀ a . a -> Maybe a )
141157 -> { encoding :: String }
142158 -> Effect UserInfo
0 commit comments