about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-session.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-session.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-session.el227
1 files changed, 227 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-session.el b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-session.el
new file mode 100644
index 000000000000..2c5344d13f03
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180601.143/haskell-session.el
@@ -0,0 +1,227 @@
+;;; haskell-session.el --- Haskell sessions -*- lexical-binding: t -*-
+
+;; Copyright (C) 2011-2012  Chris Done
+
+;; Author: Chris Done <chrisdone@gmail.com>
+
+;; This file is not part of GNU Emacs.
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Todo:
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'haskell-cabal)
+(require 'haskell-customize)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Globals
+
+;; Used internally
+(defvar-local haskell-session nil)
+
+(defvar haskell-sessions (list)
+  "All Haskell sessions in the Emacs session.")
+
+(defun haskell-session-tags-filename (session)
+  "Get the filename for the TAGS file."
+  (concat (haskell-session-cabal-dir session) "/TAGS"))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Finding/clearing the session
+
+;;;###autoload
+(defun haskell-session-maybe ()
+  "Maybe get the Haskell session, return nil if there isn't one."
+  (if (default-boundp 'haskell-session)
+      haskell-session
+    (setq haskell-session nil)))
+
+(defun haskell-session-from-buffer ()
+  "Get the session based on the buffer."
+  (when (and (buffer-file-name)
+             (consp haskell-sessions))
+    (cl-reduce (lambda (acc a)
+                 (let ((dir (haskell-session-get a 'cabal-dir)))
+                   (if dir
+                       (if (string-prefix-p dir
+                                            (file-name-directory (buffer-file-name)))
+                           (if acc
+                               (if (and
+                                    (> (length (haskell-session-get a 'cabal-dir))
+                                       (length (haskell-session-get acc 'cabal-dir))))
+                                   a
+                                 acc)
+                             a)
+                         acc)
+                     acc)))
+               haskell-sessions
+               :initial-value nil)))
+
+(defun haskell-session-default-name ()
+  "Generate a default project name for the new project prompt."
+  (let ((file (haskell-cabal-find-file)))
+    (or (when file
+          (downcase (file-name-sans-extension
+                     (file-name-nondirectory file))))
+        "haskell")))
+
+(defun haskell-session-assign (session)
+  "Assing current buffer to SESSION.
+
+This could be helpful for temporary or auxiliary buffers such as
+presentation mode buffers (e.g. in case when session is killed
+with all relevant buffers)."
+  (setq-local haskell-session session))
+
+(defun haskell-session-choose ()
+  "Find a session by choosing from a list of the current sessions."
+  (when haskell-sessions
+    (let* ((session-name (funcall haskell-completing-read-function
+                                  "Choose Haskell session: "
+                                  (cl-remove-if (lambda (name)
+                                                  (and haskell-session
+                                                       (string= (haskell-session-name haskell-session)
+                                                                name)))
+                                                (mapcar 'haskell-session-name haskell-sessions))))
+           (session (cl-find-if (lambda (session)
+                                  (string= (haskell-session-name session)
+                                           session-name))
+                                haskell-sessions)))
+      session)))
+
+(defun haskell-session-clear ()
+  "Clear the buffer of any Haskell session choice."
+  (setq-local haskell-session nil))
+
+(defun haskell-session-lookup (name)
+  "Get the session by name."
+  (cl-remove-if-not (lambda (s)
+                      (string= name (haskell-session-name s)))
+                    haskell-sessions))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Session modules
+
+(defun haskell-session-strip-dir (session file)
+  "Strip the load dir from the file path."
+  (let ((cur-dir (haskell-session-current-dir session)))
+    (if (> (length file) (length cur-dir))
+        (if (string= (substring file 0 (length cur-dir))
+                     cur-dir)
+            (replace-regexp-in-string
+             "^[/\\]" ""
+             (substring file
+                        (length cur-dir)))
+          file)
+      file)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Accessing the session
+
+(defun haskell-session-current-dir (s)
+  "Get the session current directory."
+  (let ((dir (haskell-session-get s 'current-dir)))
+    (or dir
+        (error "No current directory."))))
+
+(defun haskell-session-name (s)
+  "Get the session name."
+  (haskell-session-get s 'name))
+
+(defun haskell-session-target (s)
+  "Get the session build target.
+If `haskell-process-load-or-reload-prompt' is nil, accept `default'."
+  (let* ((maybe-target (haskell-session-get s 'target))
+         (target (if maybe-target maybe-target
+                   (let ((new-target
+                          (if haskell-process-load-or-reload-prompt
+                              (read-string "build target (empty for default):")
+                            "")))
+                     (haskell-session-set-target s new-target)))))
+    (if (not (string= target "")) target nil)))
+
+(defun haskell-session-set-target (s target)
+  "Set the session build target."
+  (haskell-session-set s 'target target))
+
+(defun haskell-session-set-interactive-buffer (s v)
+  "Set the session interactive buffer."
+  (haskell-session-set s 'interactive-buffer v))
+
+(defun haskell-session-set-process (s v)
+  "Set the session process."
+  (haskell-session-set s 'process v))
+
+;;;###autoload
+(defun haskell-session-process (s)
+  "Get the session process."
+  (haskell-session-get s 'process))
+
+(defun haskell-session-set-cabal-dir (s v)
+  "Set the session cabal-dir."
+  (let ((true-path (file-truename v)))
+    (haskell-session-set s 'cabal-dir true-path)
+    (haskell-session-set-cabal-checksum s true-path)))
+
+(defun haskell-session-set-current-dir (s v)
+  "Set the session current directory."
+  (let ((true-path (file-truename v)))
+    (haskell-session-set s 'current-dir true-path)))
+
+(defun haskell-session-set-cabal-checksum (s cabal-dir)
+  "Set the session checksum of .cabal files"
+  (haskell-session-set s 'cabal-checksum
+                       (haskell-cabal-compute-checksum cabal-dir)))
+
+(defun haskell-session-cabal-dir (s)
+  "Get the session cabal-dir."
+  (or (haskell-session-get s 'cabal-dir)
+      (let ((set-dir (haskell-cabal-get-dir (not haskell-process-load-or-reload-prompt))))
+        (if set-dir
+            (progn (haskell-session-set-cabal-dir s set-dir)
+                   set-dir)
+            (haskell-session-cabal-dir s)))))
+
+(defun haskell-session-modify (session key update)
+  "Update the value at KEY in SESSION with UPDATE."
+  (haskell-session-set
+   session
+   key
+   (funcall update
+            (haskell-session-get session key))))
+
+(defun haskell-session-get (session key)
+  "Get the SESSION's KEY value.
+Returns nil if KEY not set."
+  (cdr (assq key session)))
+
+(defun haskell-session-set (session key value)
+  "Set the SESSION's KEY to VALUE.
+Returns newly set VALUE."
+  (let ((cell (assq key session)))
+    (if cell
+        (setcdr cell value) ; modify cell in-place
+      (setcdr session (cons (cons key value) (cdr session))) ; new cell
+      value)))
+
+(provide 'haskell-session)
+
+;;; haskell-session.el ends here