4 | import JS.Inheritance
14 | %foreign "javascript:lambda:(a,b)=>a % b"
15 | prim__mod : Double -> Double -> Double
17 | %foreign "javascript:lambda:(a,b)=>Math.trunc(a / b)"
18 | prim__div : Double -> Double -> Double
20 | %foreign "javascript:lambda:v=>Number.isInteger(v)?v:Math.trunc(v)"
21 | prim__toIntegral : AnyPtr -> AnyPtr
23 | %foreign "javascript:lambda:(v,b)=>v >= b || v < (-b)?v%b:v"
24 | prim__truncSigned : Double -> Double -> Double
26 | %foreign "javascript:lambda:(v,b)=>v >= b || v < 0?Math.abs(v)%b:v"
27 | prim__truncUnsigned : Double -> Double -> Double
29 | %foreign "javascript:lambda:(a,b)=>a & b"
30 | prim__and : Double -> Double -> Double
32 | %foreign "javascript:lambda:(a,b)=>a | b"
33 | prim__or : Double -> Double -> Double
35 | %foreign "javascript:lambda:(a,b)=>a ^ b"
36 | prim__xor : Double -> Double -> Double
38 | %foreign "javascript:lambda:(a,b)=>a >> b"
39 | prim__shr : Double -> Double -> Double
41 | %foreign "javascript:lambda:(a,x,b)=>{ res = a << b; res & x ? res | (-x) : res & (x-1) }"
42 | prim__shlSigned : Double -> Double -> Double -> Double
44 | %foreign "javascript:lambda:(a,x,b)=> (a << b) & x"
45 | prim__shlUnsigned : Double -> Double -> Double -> Double
47 | %foreign "javascript:lambda:x=> Number.isInteger(x)?1:0"
48 | prim__isInteger : AnyPtr -> Double
64 | data JSInt64 : Type where [external]
67 | fromJSInt64 : JSInt64 -> Double
68 | fromJSInt64 = believe_me
71 | toJSInt64 : Double -> JSInt64
72 | toJSInt64 = believe_me
75 | truncToJSInt64 : Double -> JSInt64
76 | truncToJSInt64 v = toJSInt64 (prim__truncSigned v 9223372036854775808.0)
84 | (==) = (==) `on` fromJSInt64
88 | compare = compare `on` fromJSInt64
92 | a + b = truncToJSInt64 $
fromJSInt64 a + fromJSInt64 b
93 | a * b = truncToJSInt64 $
fromJSInt64 a * fromJSInt64 b
94 | fromInteger = truncToJSInt64 . fromInteger
98 | negate = truncToJSInt64 . negate . fromJSInt64
99 | a - b = truncToJSInt64 $
fromJSInt64 a - fromJSInt64 b
102 | Integral JSInt64 where
103 | a `div` b = toJSInt64 $
prim__div (fromJSInt64 a) (fromJSInt64 b)
104 | a `mod` b = toJSInt64 $
prim__mod (fromJSInt64 a) (fromJSInt64 b)
107 | ToFFI JSInt64 JSInt64 where toFFI = id
110 | FromFFI JSInt64 JSInt64 where fromFFI = Just
113 | SafeCast JSInt64 where
114 | safeCast = bounded (-
9223372036854775808) 9223372036854775808
130 | data JSBits64 : Type where [external]
133 | fromUInt64 : JSBits64 -> Double
134 | fromUInt64 = believe_me
137 | toUInt64 : Double -> JSBits64
138 | toUInt64 = believe_me
141 | truncToUInt64 : Double -> JSBits64
142 | truncToUInt64 v = toUInt64 (prim__truncUnsigned v 18446744073709551616.0)
145 | Show JSBits64 where
150 | (==) = (==) `on` fromUInt64
154 | compare = compare `on` fromUInt64
158 | a + b = truncToUInt64 $
fromUInt64 a + fromUInt64 b
159 | a * b = truncToUInt64 $
fromUInt64 a * fromUInt64 b
160 | fromInteger = truncToUInt64 . fromInteger
163 | Integral JSBits64 where
164 | a `div` b = toUInt64 $
prim__div (fromUInt64 a) (fromUInt64 b)
165 | a `mod` b = toUInt64 $
prim__mod (fromUInt64 a) (fromUInt64 b)
168 | ToFFI JSBits64 JSBits64 where toFFI = id
171 | FromFFI JSBits64 JSBits64 where fromFFI = Just
174 | SafeCast JSBits64 where
175 | safeCast = bounded 0 18446744073709551615