1 module Printer exposing (..)
3 import Array exposing (Array)
4 import Dict exposing (Dict)
5 import Types exposing (Env, MalExpr(..), keywordPrefix, MalFunction(..))
6 import Utils exposing (encodeString, wrap)
10 printStr : Bool -> MalExpr -> String
12 printString Env.global
15 printString : Env -> Bool -> MalExpr -> String
16 printString env readably ast =
31 printRawString env readably str
40 printList env readably list
43 printVector env readably vec
46 printMap env readably map
54 Env.getAtom atomId env
56 "(atom " ++ (printString env True value) ++ ")"
62 printBound : Env -> Bool -> List ( String, MalExpr ) -> String
63 printBound env readably =
65 printEntry name value =
66 name ++ "=" ++ (printString env readably value)
68 List.map (uncurry printEntry)
73 printRawString : Env -> Bool -> String -> String
74 printRawString env readably str =
81 printList : Env -> Bool -> List MalExpr -> String
82 printList env readably =
83 List.map (printString env readably)
88 printVector : Env -> Bool -> Array MalExpr -> String
89 printVector env readably =
90 Array.map (printString env readably)
96 printMap : Env -> Bool -> Dict String MalExpr -> String
97 printMap env readably =
99 -- Strip off the keyword prefix if it is there.
101 case String.uncons k of
102 Just ( prefix, rest ) ->
103 if prefix == keywordPrefix then
106 printRawString env readably k
109 printRawString env readably k
111 printEntry ( k, v ) =
112 (printKey k) ++ " " ++ (printString env readably v)
115 >> List.map printEntry
120 printEnv : Env -> String
124 Maybe.map toString >> Maybe.withDefault "nil"
126 printHeader frameId { outerId, exitId, refCnt } =
128 ++ (toString frameId)
130 ++ printOuterId outerId
132 ++ printOuterId exitId
136 printFrame frameId frame =
138 ((printHeader frameId frame)
139 :: (Dict.foldr printDatum [] frame.data)
142 printFrameAcc k v acc =
143 printFrame k v :: acc
146 (k ++ " = " ++ (printString env False v)) :: acc
148 "--- Environment ---\n"
149 ++ "Current frame: #"
150 ++ (toString env.currentFrameId)
152 ++ String.join "\n\n" (Dict.foldr printFrameAcc [] env.frames)