-
Notifications
You must be signed in to change notification settings - Fork 21
/
Main.purs
54 lines (40 loc) · 1.4 KB
/
Main.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
module Test.Main where
import Prelude
import Effect (Effect)
import Effect.Ref as Ref
import Test.Assert (assertEqual)
main :: Effect Unit
main = do
-- initialize a new Ref with the value 0
ref <- Ref.new 0
-- read from it and check it
curr1 <- Ref.read ref
assertEqual { actual: curr1, expected: 0 }
-- write over the ref with 1
Ref.write 1 ref
-- now it is 1 when we read out the value
curr2 <- Ref.read ref
assertEqual { actual: curr2, expected: 1 }
-- modify it by adding 1 to the current state
Ref.modify_ (\s -> s + 1) ref
-- now it is 2 when we read out the value
curr3 <- Ref.read ref
assertEqual { actual: curr3, expected: 2 }
selfRef
newtype RefBox = RefBox { ref :: Ref.Ref RefBox, value :: Int }
selfRef :: Effect Unit
selfRef = do
-- Create a self-referential `Ref`
ref <- Ref.newWithSelf \ref -> RefBox { ref, value: 0 }
-- Grab the `Ref` from within the `Ref`
ref' <- Ref.read ref <#> \(RefBox r) -> r.ref
-- Modify the `ref` and check that value in `ref'` changes
Ref.modify_ (\(RefBox r) -> RefBox (r { value = 1 })) ref
assertEqual
<<< { expected: 1, actual: _ }
=<< (Ref.read ref' <#> \(RefBox { value }) -> value)
-- Modify the `ref'` and check that value in `ref` changes
Ref.modify_ (\(RefBox r) -> RefBox (r { value = 2 })) ref'
assertEqual
<<< { expected: 2, actual: _ }
=<< (Ref.read ref <#> \(RefBox { value }) -> value)