mirror of
https://github.com/ilyakooo0/airlock.git
synced 2024-08-16 22:10:26 +03:00
tapes, cords and sum types
This commit is contained in:
parent
672e34830b
commit
d4b214ea1a
@ -1,17 +1,21 @@
|
|||||||
module Urbit.Deconstructor exposing
|
module Urbit.Deconstructor exposing
|
||||||
( Deconstructor
|
( Deconstructor
|
||||||
, alt
|
, alt
|
||||||
|
, bytes
|
||||||
, cell
|
, cell
|
||||||
|
, const
|
||||||
|
, cord
|
||||||
, float32
|
, float32
|
||||||
, float64
|
, float64
|
||||||
, int
|
, int
|
||||||
, list
|
, list
|
||||||
, llec
|
, llec
|
||||||
, map
|
, map
|
||||||
|
, oneOf
|
||||||
, run
|
, run
|
||||||
, runBytes
|
, runBytes
|
||||||
, sig
|
, sig
|
||||||
, string
|
, tape
|
||||||
, tar
|
, tar
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,8 +42,25 @@ runBytes (Deconstructor f) bs =
|
|||||||
(\noun -> f noun identity)
|
(\noun -> f noun identity)
|
||||||
|
|
||||||
|
|
||||||
string : Deconstructor (String -> a) a
|
const : Deconstructor (a -> a) a -> a -> Deconstructor c c
|
||||||
string =
|
const (Deconstructor f) value =
|
||||||
|
Deconstructor
|
||||||
|
(\noun c ->
|
||||||
|
case f noun identity of
|
||||||
|
Just a ->
|
||||||
|
if a == value then
|
||||||
|
Just c
|
||||||
|
|
||||||
|
else
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
Nothing
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
cord : Deconstructor (String -> a) a
|
||||||
|
cord =
|
||||||
Deconstructor
|
Deconstructor
|
||||||
(\x f ->
|
(\x f ->
|
||||||
case x of
|
case x of
|
||||||
@ -52,6 +73,11 @@ string =
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
tape : Deconstructor (String -> a) a
|
||||||
|
tape =
|
||||||
|
list cord |> fmap String.concat
|
||||||
|
|
||||||
|
|
||||||
int : Deconstructor (Int -> a) a
|
int : Deconstructor (Int -> a) a
|
||||||
int =
|
int =
|
||||||
Deconstructor
|
Deconstructor
|
||||||
@ -158,6 +184,16 @@ alt (Deconstructor f) (Deconstructor g) =
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
oneOf : List (Deconstructor a b) -> Deconstructor a b
|
||||||
|
oneOf l =
|
||||||
|
case l of
|
||||||
|
[] ->
|
||||||
|
Deconstructor (\_ _ -> Nothing)
|
||||||
|
|
||||||
|
x :: xs ->
|
||||||
|
alt x (oneOf xs)
|
||||||
|
|
||||||
|
|
||||||
tar : Deconstructor a a
|
tar : Deconstructor a a
|
||||||
tar =
|
tar =
|
||||||
Deconstructor (\_ a -> Just a)
|
Deconstructor (\_ a -> Just a)
|
||||||
@ -192,3 +228,8 @@ cell (Deconstructor l) (Deconstructor r) =
|
|||||||
map : a -> Deconstructor a b -> Deconstructor (b -> c) c
|
map : a -> Deconstructor a b -> Deconstructor (b -> c) c
|
||||||
map a (Deconstructor f) =
|
map a (Deconstructor f) =
|
||||||
Deconstructor (\noun g -> f noun a |> Maybe.map g)
|
Deconstructor (\noun g -> f noun a |> Maybe.map g)
|
||||||
|
|
||||||
|
|
||||||
|
fmap : (a -> b) -> Deconstructor (a -> c) c -> Deconstructor (b -> c) c
|
||||||
|
fmap f (Deconstructor g) =
|
||||||
|
Deconstructor (\noun h -> g noun (f >> h))
|
||||||
|
@ -93,6 +93,52 @@ tests =
|
|||||||
(Bytes.fromByteValues [ 0x01, 0x1F, 0x00, 0x00, 0x20, 0x08, 0x7C, 0x00, 0x00, 0x98, 0x20 ])
|
(Bytes.fromByteValues [ 0x01, 0x1F, 0x00, 0x00, 0x20, 0x08, 0x7C, 0x00, 0x00, 0x98, 0x20 ])
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
, test "[8 'hi']"
|
||||||
|
(\() ->
|
||||||
|
Expect.equal
|
||||||
|
(Just ( 8, "hi" ))
|
||||||
|
(D.runBytes
|
||||||
|
(D.cell D.int D.cord |> D.map Tuple.pair)
|
||||||
|
(Bytes.fromByteValues [ 0x41, 0x10, 0x3C, 0x5A, 0x1A ])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
, test "[8 \"hi\"]"
|
||||||
|
(\() ->
|
||||||
|
Expect.equal
|
||||||
|
(Just ( 8, "hi" ))
|
||||||
|
(D.runBytes
|
||||||
|
(D.cell D.int D.tape |> D.map Tuple.pair)
|
||||||
|
(Bytes.fromByteValues [ 0x41, 0x30, 0x38, 0x3A, 0x78, 0x5A ])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
, describe "sum types"
|
||||||
|
[ test "[%tape \"hi\"]"
|
||||||
|
(\() ->
|
||||||
|
Expect.equal
|
||||||
|
(Just "hi")
|
||||||
|
(D.runBytes
|
||||||
|
(D.oneOf
|
||||||
|
[ D.cell (D.const D.cord "tape") D.tape
|
||||||
|
, D.cell (D.const D.cord "cord") D.cord
|
||||||
|
]
|
||||||
|
)
|
||||||
|
(Bytes.fromByteValues [ 0x01, 0x9F, 0x2E, 0x0C, 0xAE, 0x1C, 0x1C, 0x1D, 0x3C, 0x2D ])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
, test "[%cord 'hi']"
|
||||||
|
(\() ->
|
||||||
|
Expect.equal
|
||||||
|
(Just "hi")
|
||||||
|
(D.runBytes
|
||||||
|
(D.oneOf
|
||||||
|
[ D.cell (D.const D.cord "tape") D.tape
|
||||||
|
, D.cell (D.const D.cord "cord") D.cord
|
||||||
|
]
|
||||||
|
)
|
||||||
|
(Bytes.fromByteValues [ 0x01, 0x7F, 0xEC, 0x4D, 0x8E, 0x0C, 0x1E, 0x2D, 0x0D ])
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user