mirror of
https://github.com/unisonweb/unison.git
synced 2024-09-25 17:27:52 +03:00
editor fully connected to outside world
This commit is contained in:
parent
c5760491e9
commit
0fc01c6c52
@ -23,6 +23,9 @@ type Status e = Inactive | Waiting | Failed e
|
||||
post : Host -> Path -> Encoder a -> Decoder b -> Request a b
|
||||
post host path e d = Request (jsonPost e host path) d
|
||||
|
||||
contramap : (a0 -> a) -> Request a b -> Request a0 b
|
||||
contramap f r = { r | encoder <- r.encoder << f }
|
||||
|
||||
map : (b -> c) -> Request a b -> Request a c
|
||||
map f r = { r | decoder <- Decoder.map f r.decoder }
|
||||
|
||||
|
@ -2,6 +2,7 @@ module Unison.Editor where
|
||||
|
||||
import Debug
|
||||
import Execute
|
||||
import Elmz.Json.Request as JR
|
||||
import Elmz.Layout (Containment(Inside,Outside), Layout, Pt, Region)
|
||||
import Elmz.Layout as Layout
|
||||
import Elmz.Moore (Moore(..))
|
||||
@ -15,6 +16,7 @@ import Graphics.Input.Field as Field
|
||||
import Maybe
|
||||
import Mouse
|
||||
import Keyboard
|
||||
import Result
|
||||
import Signal
|
||||
import Unison.Action as Action
|
||||
import Unison.Explorer as Explorer
|
||||
@ -195,16 +197,65 @@ main =
|
||||
let
|
||||
host = "http://localhost:8080"
|
||||
(offsetX, offsetY) = (10, 10)
|
||||
offsetMouse (x,y) = (x-offsetX, y-offsetY)
|
||||
offsetMouse (x,y) = (x - offsetX, y - offsetY)
|
||||
searchbox = Signal.channel Field.noContent
|
||||
merge = Signal.merge
|
||||
|
||||
reqChan : Signal.Channel (Maybe Request)
|
||||
reqChan = Signal.channel Nothing
|
||||
|
||||
--| Declare Term
|
||||
responses : Signal (Maybe Event)
|
||||
responses = Signal.subscribe reqChan
|
||||
|> Debug.crash "todo"
|
||||
responses =
|
||||
let
|
||||
reqs = Signal.subscribe reqChan
|
||||
|
||||
evaluations =
|
||||
let
|
||||
match r = case r of
|
||||
Just (Evaluations es) -> Just es
|
||||
_ -> Nothing
|
||||
in JR.send (Node.evaluateTerms host `JR.to` EvaluationResults) [] (Signal.map match reqs) |> Signal.map raise
|
||||
|
||||
edits =
|
||||
let
|
||||
z = ([], [], Action.Noop, Term.Blank) -- bogus initial edit
|
||||
match r = case r of
|
||||
Just (EditRequest focus action) ->
|
||||
Just (focus.pathToClosedSubterm, focus.pathFromClosedSubterm, action, focus.closedSubterm)
|
||||
_ -> Nothing
|
||||
in JR.send (Node.editTerm host `JR.to` Replace) z (Signal.map match reqs) |> Signal.map raise
|
||||
|
||||
localInfos =
|
||||
let
|
||||
match r = case r of
|
||||
Just (ExplorerRequest (TermExplorer.LocalInfo focus)) -> Just (focus.closedSubterm, focus.pathFromClosedSubterm)
|
||||
_ -> Nothing
|
||||
in JR.send (Node.localInfo host `JR.to` LocalInfoResults) (Term.Blank, []) (Signal.map match reqs) |> Signal.map raise
|
||||
|
||||
metadatas =
|
||||
let
|
||||
match r = case r of
|
||||
Just (Metadatas refs) -> Just refs
|
||||
_ -> Nothing
|
||||
in JR.send (Node.metadatas host `JR.to` MetadataResults) [] (Signal.map match reqs) |> Signal.map raise
|
||||
|
||||
searches =
|
||||
let
|
||||
z = (Term.Blank, [], 1, "@#$@#", Nothing) -- bogus initial search
|
||||
match r = case r of
|
||||
Just (ExplorerRequest (TermExplorer.Search args)) -> Just args
|
||||
_ -> Nothing
|
||||
in JR.send (Node.search host `JR.to` SearchResults) z (Signal.map match reqs)
|
||||
|> Signal.map raise
|
||||
|
||||
raise : Result (JR.Status String) Event -> Maybe Event
|
||||
raise r = case r of
|
||||
Result.Err _ -> Nothing -- todo, pass this along somehow
|
||||
Result.Ok e -> Just e
|
||||
|
||||
in
|
||||
evaluations `merge` edits `merge` localInfos `merge` metadatas `merge` searches
|
||||
|
||||
actions : Signal (Maybe Event)
|
||||
actions =
|
||||
|
@ -53,20 +53,22 @@ dependents host = Request.post host "dependents"
|
||||
(Encoder.tuple2 (Encoder.optional (Encoder.list Reference.encode)) Reference.encode)
|
||||
(Decoder.list Reference.decode)
|
||||
|
||||
editTerm : Host -> Request (Path, Path, Action, Term) (Path,Term,Term)
|
||||
type alias Replacement = { path : Path, old : Term, new : Term }
|
||||
|
||||
editTerm : Host -> Request (Path, Path, Action, Term) Replacement
|
||||
editTerm host = Request.post host "edit-term"
|
||||
(Encoder.tuple4 Path.encodePath Path.encodePath A.encode E.encodeTerm)
|
||||
(Decoder.tuple3 Path.decodePath E.decodeTerm E.decodeTerm)
|
||||
(Decoder.product3 Replacement Path.decodePath E.decodeTerm E.decodeTerm)
|
||||
|
||||
editType : Host -> Request (Path, Action, Type) Type
|
||||
editType host = Request.post host "edit-type"
|
||||
(Encoder.tuple3 Path.encodePath A.encode T.encodeType)
|
||||
T.decodeType
|
||||
|
||||
evaluateTerms : Host -> Request (List (Path, Term)) (List (Path,Term,Term))
|
||||
evaluateTerms : Host -> Request (List (Path, Term)) (List Replacement)
|
||||
evaluateTerms host = Request.post host "evaluate-terms"
|
||||
(Encoder.list (Encoder.tuple2 Path.encodePath E.encodeTerm))
|
||||
(Decoder.list (Decoder.tuple3 Path.decodePath E.decodeTerm E.decodeTerm))
|
||||
(Decoder.list (Decoder.product3 Replacement Path.decodePath E.decodeTerm E.decodeTerm))
|
||||
|
||||
type alias LocalInfo =
|
||||
{ current : Type
|
||||
@ -85,10 +87,10 @@ localInfo host = Request.post host "local-info"
|
||||
(Decoder.list Decoder.int)
|
||||
(Decoder.list E.decodeTerm))
|
||||
|
||||
metadatas : Host -> Request (List Reference) (M.Dict Reference.Key Metadata)
|
||||
metadatas : Host -> Request (List Reference) (List (Reference.Key, Metadata))
|
||||
metadatas host = Request.post host "metadatas"
|
||||
(Encoder.list Reference.encode)
|
||||
(Reference.decodeMap MD.decodeMetadata)
|
||||
(Reference.decodeAssociationList MD.decodeMetadata)
|
||||
|
||||
type alias SearchResults =
|
||||
{ query : Query
|
||||
|
@ -28,7 +28,6 @@ encode r = case r of
|
||||
Builtin b -> Encoder.tag' "Builtin" Encoder.string b
|
||||
Derived h -> Encoder.tag' "Derived" H.encode h
|
||||
|
||||
|
||||
decodeAssociationList : Decoder v -> Decoder (List (Key, v))
|
||||
decodeAssociationList v =
|
||||
Decoder.list (Decoder.tuple2 decode v)
|
||||
|
Loading…
Reference in New Issue
Block a user